o
    ]ZhP                     @   s~   d Z ddlZddlZedZed G dd dZdd Zd	d
 Zdd Z	ej
dedddd Zdd Zdd ZdS )z Unit tests for layout functions.    NnumpyZscipyc                   @   s   e Zd Ze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#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Z d;d< Z!d=d> Z"d?d@ Z#dAdB Z$dCdD Z%dES )F
TestLayoutc                 C   s8   t dd| _t  | _t | jd t dd| _d S )N   Zabcdef   )nxZgrid_2d_graphGiGraphGsZadd_pathbigG)cls r   Q/var/www/auris/lib/python3.10/site-packages/networkx/drawing/tests/test_layout.pysetup_class   s   
zTestLayout.setup_classc                 C   s\   t d}tjtt j|dgd ddd}tjtt j|ddg|d t j|dd	g|d d S )
N   r   )fixed   r   r   r   r      r   )r   posr   )r   
path_graphpytestraises
ValueErrorspring_layout)selfGr   r   r   r   test_spring_fixed_without_pos   s
   

z(TestLayout.test_spring_fixed_without_posc                    sf   dd l  t }|g d ddi}dg}tj|||d}t fdd| D }|r1J dd S )Nr   )r   r   r   r   )r   r   )r              r#   r   r   c                 3   s$    | ]}|D ]}  |V  qqd S N)isnan).0Zcoordscmathr   r   	<genexpr>$   s   " z2TestLayout.test_spring_init_pos.<locals>.<genexpr>zvalues should not be nan)r*   r   r   add_edges_fromfruchterman_reingold_layoutanyvalues)r   r   Zinit_posZ	fixed_posr   Zhas_nanr   r)   r   test_spring_init_pos   s   zTestLayout.test_spring_init_posc                 C   sx   g }t | t | t | t | t | t | t | t || t 	| t 
| t | d S r%   )r   random_layoutcircular_layoutplanar_layoutr   r-   spectral_layoutshell_layoutbipartite_layoutspiral_layoutmultipartite_layoutkamada_kawai_layoutr   r   r   r   r   test_smoke_empty_graph'   s   








z!TestLayout.test_smoke_empty_graphc                 C   s   | j }t| t| t| t| t| t| t| j t	| t	|
  t	| j t	| j
  t| t| t| tj|dd tj|dd t| d S Nr   dimr!   )r   r   r1   r2   r3   r   forceatlas2_layoutr-   r
   r4   Zto_directedr5   r7   r9   
arf_layoutr:   r   r   r   test_smoke_int5   s$   









zTestLayout.test_smoke_intc                 C   s   | j }t| t| t| t| t| t| t| t	| t
| t| tj|dd tj|dd t| d S r<   )r	   r   r1   r2   r3   r   r?   r-   r4   r5   r7   r9   r@   r:   r   r   r   test_smoke_stringI   s   









zTestLayout.test_smoke_stringc                 C   sx   t |}|| }|| }t t| }|d|d }|d| k s*J ||k s2J ||k s:J d S )Nr   r   )nparraylistr/   maxminall)r   r   scalecenterlowhivposlengthr   r   r   check_scale_and_centerY   s   
z!TestLayout.check_scale_and_centerc                 C   s   | j }d}td}|d |tj||dddd |tj|d|dd|d |tj|d|dd|d |tj|d|dd|d |tj|d|dd|d |tj	|d|dd|d |tj
|d|dd|d d}|tj
|d	d|d
d|d d S )N)r   r   	   rJ         ?)g      @g      @rI   rJ   r   )r   r!   r   r!   )r>   rI   rJ   rO   r   complete_graphadd_noder1   r   r4   r2   r5   r7   r9   r   scr(   r   r   r   r   test_scale_and_center_argc   s   

 z$TestLayout.test_scale_and_center_argc                 C   s    t d}tt jt j| d S )NrP   )r   rU   r   r   ZNetworkXExceptionr3   r:   r   r   r   #test_planar_layout_non_planar_inputt   s   
z.TestLayout.test_planar_layout_non_planar_inputc                 C   s4   t  }|ddgddgddgd t | d S )Nr   r   r   r   r   r   )r   ZPlanarEmbeddingset_datar3   )r   Z	embeddingr   r   r   (test_smoke_planar_layout_embedding_inputx   s   z3TestLayout.test_smoke_planar_layout_embedding_inputc                 C   s   | j }d}td}|d |t|ddd |t|d|d |t|d|d |t|d|d |t|d|d |t	|d|d |t
|d|d d}|tj
|dd	d|d d S )
Nr   rP   rR   rR   rR   rS   r   )r   r   r   r!   r=   rT   rW   r   r   r   test_default_scale_and_center}   s   

z(TestLayout.test_default_scale_and_centerc                 C   sr   t d}tjtt j|dd tjtt j|dd tjtt j|dd tjtt j|dd tjtt j|dd d S )Nr   r   r=   r!   )r   r   r   r   r   r2   r5   r3   r:   r   r   r   (test_circular_planar_and_shell_dim_error   s   
z3TestLayout.test_circular_planar_and_shell_dim_errorc                 C   sh   t | j}t jj|}|jdksJ t jjj|dd}|jdks$J t jj|}|jdks2J d S )N   r   r!   r=   rb   r!   )r   Zto_numpy_arrayr	   drawinglayoutZ_fruchterman_reingoldshape_sparse_fruchterman_reingoldr   Ar   r   r   r   test_adjacency_interface_numpy   s   z)TestLayout.test_adjacency_interface_numpyc                 C   sl   t j| jdd}t jj|}|jdksJ t jj|}|jdks$J t jjj|dd}|jdks4J d S )Nd)Zdtypera   r!   r=   rc   )r   Zto_scipy_sparse_arrayr	   rd   re   rg   rf   Z_sparse_spectralrh   r   r   r   test_adjacency_interface_scipy   s   z)TestLayout.test_adjacency_interface_scipyc                 C   s   t d}t |}|d  rJ t d}t |dgddgdgg}|d  r,J |d  s4J tj|d dks@J t j|dgddgdggdd}tj|d dks[J d S )Nr   r   r   r   r!   )rotate)r   r   r5   r.   rC   linalgnormr   r   rM   r   r   r   test_single_nodes   s   


zTestLayout.test_single_nodesc                 C       t | j}t j| j|d}d S N)r   )r   r2   r   r?   r   r   nposr   r   r   "test_smoke_initial_pos_forceatlas2      z-TestLayout.test_smoke_initial_pos_forceatlas2c                 C   rr   rs   )r   r2   r   r-   rt   r   r   r   +test_smoke_initial_pos_fruchterman_reingold   rw   z6TestLayout.test_smoke_initial_pos_fruchterman_reingoldc                 C   rr   rs   )r   r2   r   r@   rt   r   r   r   test_smoke_initial_pos_arf   rw   z%TestLayout.test_smoke_initial_pos_arfc                 C   s   t | j}t j| j|dgd}t|d t|d ksJ t | j}t j| j|dgd}tdD ]}|d | tj|d | ddksGJ q2d S )Nr   r$   r   Hz>abs)	r   r2   r   r   tupler
   ranger   approx)r   r   ru   axisr   r   r   $test_fixed_node_fruchterman_reingold   s   (z/TestLayout.test_fixed_node_fruchterman_reingoldc                 C   s
  t d}t j|dd t j|dd}t|d dksJ t j|dd}t|d dks.J t j|dd}t|d dks?J t j|dd}t|d dksPJ t j|dd}t|d dksaJ t j	|dd}t|d dksrJ t j
|dd}t|d dksJ d S )Nr   r   rQ   r   )r   r   r1   r2   r}   r3   r   r-   r4   r5   r7   rp   r   r   r   test_center_parameter   s    
z TestLayout.test_center_parameterc                 C   s   t d}tt jtt jksJ tjtt j|dd tjtt j	|dd tjtt j
|dd tjtt j|dd tjtt j|ddd tjtt j|dd tjtt j|ddd tjtt j|dd tjtt j|dd tjtt j|dd d S )Nr   )r   r   r   rQ   r!   r   )r>   rJ   )r   r   idr   r-   r   r   r   r1   r2   r3   r4   r5   r7   r9   r:   r   r   r   test_center_wrong_dimensions   s   
z'TestLayout.test_center_wrong_dimensionsc                 C   sT  t  }t j|dd}|i ksJ t j|dd}|i ksJ t j|dd}|i ks+J t ||}|i ks7J t j|dd}|i ksDJ t j|dd}|i ksQJ t j|dd}|i ks^J t j	|dd}|i kskJ t j
|dd}|i ksxJ t j|dd}|i ksJ t j|dd}|i ksJ t |}|i ksJ t |}|i ksJ d S )Nr   rQ   )r   empty_graphr1   r2   r3   r6   r   r-   r4   r5   r7   r8   r9   r?   r@   rp   r   r   r   test_empty_graph   s6   

zTestLayout.test_empty_graphc           
      C   sH  t dd}t j|\}}t ||}t|t|ksJ |t|d  d }|t|d  d }|D ]}|| d |ks@J q4|D ]}|| d |ksOJ qCt j||ddddd}t|t|kseJ |t|d  d }|t|d  d }	|D ]}|| d |ksJ q{|D ]}|| d |	ksJ qtjt	t j||d	d
 d S )Nr!   r   r   
horizontalr   r   r   r   )alignrJ   rI   Zaspect_ratiofoor   )
r   Zcomplete_bipartite_graphZ	bipartiteZsetsr6   lenrE   r   r   r   )
r   r   topbottomrM   Ztop_xZbottom_xnodeZtop_yZbottom_yr   r   r   test_bipartite_layout  s*   z TestLayout.test_bipartite_layoutc                    s   d}t j| }t |tt|ksJ d |D ]} | }t fddt d |D s3J  |7  qt j|dddd	tt|ksKJ d |D ]} | }t fd
dt d |D shJ  |7  qOtjtt j|dd d S )N)r   r      r      r   c                 3   (    | ]}  d  | d  kV  qdS )r   Nr   r'   istartrM   r   r   r+   -     & z6TestLayout.test_multipartite_layout.<locals>.<genexpr>r   r   r   r   )r   rI   rJ   c                 3   r   )r   Nr   r   r   r   r   r+   6  r   r   r   )	r   Zcomplete_multipartite_graphr8   r   rH   r~   r   r   r   )r   sizesr   nendr   r   r   test_multipartite_layout#  s"   

&
&
z#TestLayout.test_multipartite_layoutc                 C   s   t jjj}tddg}dtddgddgg }||t|ddd\}}|tjd	d
dks/J |d tjdd
dks<J |d tjdd
dksIJ d S )Ng      @g      @r   皙?g       @333333?r   Z
meanweightr>   g      ?rz   r{         rR   )r   rd   re   _kamada_kawai_costfnrC   rD   r   r   )r   costfnr   invdistcostgradr   r   r   test_kamada_kawai_costfn_1d;  s   
z&TestLayout.test_kamada_kawai_costfn_1dc              	   C   s  t jjj}|| t|||d\}}d| ttj|ddd  }t|jd D ])}	t|	d |jd D ]}
tj	
||	 ||
  }||||	 |
  d d 7 }q5q)|tj|dd	ks^J d
}t|jd D ]Z}t|jd D ]P}||jd  | }| }||  |7  < ||t|||jd dd }||  d| 8  < ||t|||jd dd }|| tj|| d|  dd	ksJ qpqgd S )Nr   rR   r   r   r   r         ?rz   r{   g-C6?gh㈵>)r   rd   re   r   ZravelrC   sumr~   rf   rn   ro   r   r   flatten)r   r   r   meanwtr>   r   r   r   Zexpected_costr   jdiffZdxnddmidxZpsZcplusZcminusr   r   r   check_kamada_kawai_costfnG  s*   
 (z$TestLayout.check_kamada_kawai_costfnc                 C   s   dt g dg dg dg }d}t ddgdd	gd
dgg}| |||d t g dg dg dg}| |||d d S )Nr   )r    @333333?)r   g?333333?)r   r   r   r   g?g	g@g333333ӿgffffff@g      @r   )g?g333333!@gffffff!)ir   gffffff)g333333"@g333333 g?r!   )rC   rD   r   )r   r   r   r   r   r   r   test_kamada_kawai_costfnb  s    z#TestLayout.test_kamada_kawai_costfnc                 C   s   | j }tttj|dd }tttj|dd }tjj|d d |dd   dd}tjj|d d |dd   dd}t	|t	|ksMJ tttj|dd }tjj|d d |dd   dd}tj
|dd  |d d	d
s}J d S )Ngffffff?)
resolutiong(\?r   r   TZequidistantg{Gz?Zatol)r	   rC   rD   rE   r   r7   r/   rn   ro   r   allclose)r   r   Zpos_standardZpos_tighterZ	distancesZdistances_tighterZpos_equidistantZdistances_equidistantr   r   r   test_spiral_layoutp  s   $$zTestLayout.test_spiral_layoutc                 C   sl   t d}t j|dd}tt| }tjj|dd  |d d  dd}tj	t
|ddd	s4J d S )
N
   Tr   r   r   r   r   gMbP?r   )r   r   r7   rC   rD   rE   r/   rn   ro   r   r   )r   r   r   pdistr   r   r   test_spiral_layout_equidistant  s
   
$z)TestLayout.test_spiral_layout_equidistantc                 C   H   | j }tj|}t|}||= tj||d}t|t|ks"J d S rs   )r	   r   utilsarbitrary_elementr2   r?   r   r   r   r   r   r   r   r   *test_forceatlas2_layout_partial_input_test     
z5TestLayout.test_forceatlas2_layout_partial_input_testc                 C   s&  t  }t j|dd}t |i ksJ t d}ddd}t |}tjdd t|  D d	k s6J t d
}dddd}t |}t	dt	dt	dd}|
 D ]\}}|| |k sgJ qYt j|dd}t	dt	dt	dd}|
 D ]\}}|| |k sJ qd S )Nr   rQ   r   r"   )r   r   r   c                 S   s   g | ]}t |qS r   )r   )r'   xr   r   r   
<listcomp>  s    z7TestLayout.test_rescale_layout_dict.<locals>.<listcomp>gư>r!   r   r^   r[   )r   r   )rI   )r   r   )r   r   r1   Zrescale_layout_dictrC   rn   ro   zipr/   rD   itemsrH   )r   r   rM   Zs_vposZexpectationkvr   r   r   test_rescale_layout_dict  s0   


&

z#TestLayout.test_rescale_layout_dictc                 C   r   rs   )r	   r   r   r   r2   r@   r   r   r   r   r   "test_arf_layout_partial_input_test  r   z-TestLayout.test_arf_layout_partial_input_testc                 C   s   | j }tjttj|dd dS )zl
        Checks input parameters correctly raises errors. For example,  `a` should be larger than 1
        r   )r   aN)r	   r   r   r   r   r@   r:   r   r   r    test_arf_layout_negative_a_check  s   z+TestLayout.test_arf_layout_negative_a_checkc                 C   sB   | j }tj|dd tj|dd tj|dd tj|dd d S )N*   )seed)r	   r   r1   r   r@   r?   r:   r   r   r   test_smoke_seed_input  s
   z TestLayout.test_smoke_seed_inputN)&__name__
__module____qualname__classmethodr   r   r0   r;   rA   rB   rO   rY   rZ   r]   r_   r`   rj   rl   rq   rv   rx   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      sH    

					r   c                  C   sp   t  } | jddd | jddd | jddd | jddd | g d t | }t|t| ks6J d	S )
zSee gh-5123.r   s0subsetr   r   s1r!   )r   )r   r!   r    N)r   r   rV   r,   r8   r   )r   r   r   r   r   4test_multipartite_layout_nonnumeric_partition_labels  s   
r   c                  C   s.  t  } ttdd}| D ]\}}| j||d qt j| dd}t j|}t j| d|d}t| | D ]\\}}\}	}
||	krK||
k	 sMJ q9|d d |d	 d ks\J |d
 d |d d   k r||d d   k r||d d k sJ  J d| j
d d< t | }| | ksJ dS )zgReturn the layers in sorted order if the layers of the multipartite
    graph are sortable. See gh-5691)r   br(   rk   e)r   r!   r   r   r   r   r   r   )r   Z
subset_keyr   r   rk   r(   r   r   Zlayer_0r   N)r   r   dictr   r   rV   r8   r   groupsrH   nodeskeys)r   Z
node_groupr   layerr   ZlayersZpos_from_layersZn1p1Zn2p2Z
pos_nosortr   r   r   $test_multipartite_layout_layer_order  s   "F
r   c                 C   s4   t t|  dddf }t j|dd\}}|S )zJHelper function to extract the number of nodes in each layer of bfs_layoutNr   T)Zreturn_counts)rC   rD   rE   r/   unique)r   r   _Zlayer_countr   r   r   _num_nodes_per_bfs_layer  s   r   r   r   r   c                 C   s8   t | }t j|dd}tt|d| d gsJ dS )zrThe complete graph should result in two layers: the starting node and
    a second layer containing all neighbors.r   r   r   N)r   rU   
bfs_layoutrC   array_equalr   )r   r   r   r   r   r   test_bfs_layout_complete_graph  s   
 r   c                  C   s   t dd} t j| dd}g d}tt||sJ t j| dd}tt||s,J t j| dd}g d}tt||sAJ d S )	Nr   r!   r   r   )r   r   r   r   r   r   r      rb   )r   r   r   r   )r   Zbarbell_graphr   rC   r   r   )r   r   Zexpected_nodes_per_layerr   r   r   test_bfs_layout_barbell  s   r   c                  C   s\   t d} | ddg tjt jdd t j| dd W d    d S 1 s'w   Y  d S )Nr   )r      )r   r   z#bfs_layout didn't include all nodes)matchr   r   )r   rU   r,   r   r   ZNetworkXErrorr   )r   r   r   r   test_bfs_layout_disconnected  s
   
"r   )__doc__r   Znetworkxr   ZimportorskiprC   r   r   r   r   markZparametrizer~   r   r   r   r   r   r   r   <module>   s     

   F
