U
    ¹mœd±E  ã                   @   sJ   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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?S )@Ú
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   ú[/home/sam/Atlas/atlas_env/lib/python3.8/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                    sj   dd l ‰ t ¡ }| ddddg¡ ddi}dg}tj|||d�}t‡ fdd	„| ¡ D ƒƒ}|rft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ÚAssertionError)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 | 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   r2   r3   r4   r   r-   r
   r5   Zto_directedr6   r8   r:   Ú
arf_layoutr;   r   r   r   Útest_smoke_int4   s"    








zTestLayout.test_smoke_intc                 C   sŠ   | j }t |¡ t |¡ t |¡ t |¡ t |¡ t |¡ t |¡ t 	|¡ t 
|¡ tj
|dd� tj
|dd� t |¡ d S r=   )r	   r   r2   r3   r4   r   r-   r5   r6   r8   r:   r@   r;   r   r   r   Útest_smoke_stringG   s    








zTestLayout.test_smoke_stringc                 C   sx   t  |¡}|| }|| }t  t| ¡ ƒ¡}| d¡| d¡ }|d| k ¡ sTt‚||k ¡ sdt‚||k ¡ stt‚d S )Nr   r   )ÚnpÚarrayÚlistr/   ÚmaxÚminÚallr0   )r   r   ÚscaleÚcenterÚlowÚhiÚvposÚlengthr   r   r   Úcheck_scale_and_centerV   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_noder2   r   r5   r3   r6   r8   r:   ©r   Úscr(   r   r   r   r   Útest_scale_and_center_arg`   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NetworkXExceptionr4   r;   r   r   r   Ú#test_planar_layout_non_planar_inputq   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_datar4   )r   Z	embeddingr   r   r   Ú(test_smoke_planar_layout_embedding_inputu   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_centerz   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   r3   r6   r4   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(t‚t jjj|dd�}|jdksHt‚t jj |¡}|jdksdt‚d S )N©é   r   r!   r>   ©rb   r!   )	r   Zto_numpy_arrayr	   ÚdrawingÚlayoutZ_fruchterman_reingoldÚshaper0   Ú_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,t‚t jj |¡}|jdksHt‚t jjj|dd�}|jdksht‚d S )NÚd)Zdtypera   r!   r>   rc   )	r   Zto_scipy_sparse_arrayr	   rd   re   rg   rf   r0   Z_sparse_spectralrh   r   r   r   Útest_adjacency_interface_scipy›   s    z)TestLayout.test_adjacency_interface_scipyc                 C   sº   t  d¡}t  |¡}|d  ¡ r$t‚t  d¡}t  |dgddgdgg¡}|d  ¡ rXt‚|d  ¡ sht‚tj |d ¡dks€t‚t j|dgddgdggdd�}tj |d ¡dks¶t‚d S )Nr   r   r   r   r!   )Úrotate)r   r   r6   r.   r0   rC   ÚlinalgÚnorm©r   r   rM   r   r   r   Útest_single_nodes¤   s    


zTestLayout.test_single_nodesc                 C   s    t  | j¡}t j| j|d�}d S ©N©r   )r   r3   r   r-   ©r   r   Únposr   r   r   Ú+test_smoke_initial_pos_fruchterman_reingold°   s    z6TestLayout.test_smoke_initial_pos_fruchterman_reingoldc                 C   s    t  | j¡}t j| j|d�}d S rr   )r   r3   r   r@   rt   r   r   r   Útest_smoke_initial_pos_arf´   s    z%TestLayout.test_smoke_initial_pos_arfc                 C   s”   t  | j¡}t j| j|dgd�}t|d ƒt|d ƒks<t‚t  | j¡}t j| j|dgd�}tdƒD ]*}|d | tj	|d | dd�ksdt‚qdd S )Nr   r$   r   çH¯¼šò×z>©Úabs)
r   r3   r   r   Útupler0   r
   Ú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:t‚t j|dd�}t|d ƒdks\t‚t j|dd�}t|d ƒdks~t‚t j|dd�}t|d ƒdks t‚t j	|dd�}t|d ƒdksÂt‚t j
|dd�}t|d ƒdksät‚t j|dd�}t|d ƒdk�st‚d S )Nr   r   rQ   r   )r   r   r2   r3   r{   r0   r4   r   r-   r5   r6   r8   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"t‚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-   r0   r   r   r   r2   r3   r4   r5   r6   r8   r:   r;   r   r   r   Útest_center_wrong_dimensionsÕ   s    
z'TestLayout.test_center_wrong_dimensionsc                 C   sD  t  ¡ }t j|dd�}|i ks"t‚t j|dd�}|i ks<t‚t j|dd�}|i ksVt‚t  ||¡}|i ksnt‚t j|dd�}|i ksˆt‚t j|dd�}|i ks¢t‚t j	|dd�}|i ks¼t‚t j
|dd�}|i ksÖt‚t j|dd�}|i ksðt‚t j|dd�}|i k�st‚t j|dd�}|i k�s(t‚t  |¡}|i k�s@t‚d S )Nr   rQ   )r   Úempty_graphr2   r0   r3   r4   r7   r   r-   r5   r6   r8   r9   r:   r@   rp   r   r   r   Útest_empty_graphã   s2    
zTestLayout.test_empty_graphc           
      C   sL  t  dd¡}t j |¡\}}t  ||¡}t|ƒt|ƒks<t‚|t|ƒd  d }|t|ƒd  d }|D ]}|| d |ksht‚qh|D ]}|| d |ks†t‚q†t j||ddddd�}t|ƒt|ƒksÊt‚|t|ƒd  d }|t|ƒd  d }	|D ]}|| d |ksöt‚qö|D ]}|| d |	k�st‚�qt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setsr7   Úlenr0   rE   r   r   r   )
r   r   ÚtopÚbottomrM   Ztop_xZbottom_xÚnodeZtop_yZbottom_yr   r   r   Útest_bipartite_layoutþ   s4         ÿz TestLayout.test_bipartite_layoutc                    sò   d}t j|Ž }t  |¡‰tˆƒt|ƒks,t‚d‰ |D ]:}ˆ | }t‡ ‡fdd„tˆ d |ƒD ƒƒsft‚ˆ |7 ‰ q4t j|dddd	�‰tˆƒt|ƒks–t‚d‰ |D ]:}ˆ | }t‡ ‡fd
d„tˆ d |ƒD ƒƒsÐt‚ˆ |7 ‰ qžtjt	t j|dd� d S )N)r   r   é   r   é   r   c                 3   s&   | ]}ˆˆ  d  ˆ| d  kV  qdS )r   Nr   ©r'   Úi©ÚstartrM   r   r   r+   $  s     z6TestLayout.test_multipartite_layout.<locals>.<genexpr>r   r…   r   r†   )r‡   rI   rJ   c                 3   s&   | ]}ˆˆ  d  ˆ| d  kV  qdS )r   Nr   r‘   r“   r   r   r+   -  s     rˆ   r‰   )
r   Zcomplete_multipartite_graphr9   rŠ   r0   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^t‚|d tjdd
d�ksxt‚|d tjdd
d�ks’t‚d S )Ng      @g      @r   çš™™™™™¹?g       @ç333333Ó?r   ©Z
meanweightr?   g      Ð?rx   ry   ç      à¿rR   )	r   rd   re   Ú_kamada_kawai_costfnrC   rD   r   r}   r0   )r   Úcostfnr   ÚinvdistÚcostÚgradr   r   r   Útest_kamada_kawai_costfn_1d2  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 ]R}	t|	d |jd ƒD ]8}
tj	 
||	 ||
  ¡}||||	 |
  d d 7 }qjqR|tj|dd	�ks¼t‚d
}t|jd ƒD ]´}t|jd ƒD ] }||jd  | }| ¡ }||  |7  < ||t|||jd d�d }||  d| 8  < ||t|||jd d�d }|| tj|| d|  dd	�ksàt‚qàqÎd S )Nr›   rR   r   ©r~   r   r   ç      ð?rx   ry   g-Cëâ6?gñhãˆµøä>)r   rd   re   r�   ZravelrC   Úsumr|   rf   rn   ro   r   r}   r0   Ú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_costfn>  s$    
  z$TestLayout.check_kamada_kawai_costfnc                 C   sŒ   dt  dddgdddgdddgg¡ }d}t  dd	gd
dgddgg¡}|  |||d¡ t  dddgdddgdddgg¡}|  |||d¡ d S )Nr   r™   gÍÌÌÌÌÌ @g333333û?gš™™™™™É?g333333ã?rš   gÍÌÌÌÌÌô?gš™™™™™	Àgš™™™™™@g333333Ó¿gffffff@g      @r   gÍÌÌÌÌÌì?g333333!@gffffff!Àiöÿÿÿrœ   gffffffÀg333333"@g333333 Àgš™™™™™ù?r!   )rC   rD   r­   )r   rŸ   r§   r   r   r   r   Útest_kamada_kawai_costfnY  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sšt
‚t ttj|dd� ¡ ƒ¡}tjj|d d… |dd …  dd�}tj|dd … |d d	d
�sút
‚d S )NgffffffÖ?)Ú
resolutiongÃõ(\�ÂÕ?éÿÿÿÿr   r£   T©Zequidistantg{®Gáz„?©Zatol)r	   rC   rD   rE   r   r8   r/   rn   ro   r¥   r0   Úallclose)r   r   Zpos_standardZpos_tighterZ	distancesZdistances_tighterZpos_equidistantZdistances_equidistantr   r   r   Útest_spiral_layoutg  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	�sht‚d S )
Né
   Tr±   r   r°   r£   r   gü©ñÒMbP?r²   )r   r   r8   rC   rD   rE   r/   rn   ro   r³   r©   r0   )r   r   r   ÚpÚdistr   r   r   Útest_spiral_layout_equidistant}  s
    
$z)TestLayout.test_spiral_layout_equidistantc                 C   s*  t  ¡ }t j|dd�}t  |¡i ks(t‚t  d¡}dddœ}t  |¡}tj dd„ t| 	¡ Ž D ƒ¡d	k slt‚t  d
¡}ddddœ}t  |¡}t 
d¡t 
d¡t 
d¡dœ}| ¡ D ]\}}|| |k ¡ s²t‚q²t j|dd�}t 
d¡t 
d¡t 
d¡dœ}| ¡ D ] \}}|| |k ¡ �st‚�qd 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ƒ   r2   Zrescale_layout_dictr0   rC   rn   ro   Úzipr/   rD   ÚitemsrH   )r   r   rM   Zs_vposZexpectationÚkÚvr   r   r   Útest_rescale_layout_dict†  s.    


&

ýýz#TestLayout.test_rescale_layout_dictc                 C   sH   | j }tj |¡}t |¡}||= tj||d�}t|ƒt|ƒksDt‚dS )zS
        Checks whether partial pos input still returns a proper position.
        rs   N)r	   r   ÚutilsZarbitrary_elementr3   r@   rŠ   r0   )r   r   r�   r   r   r   r   Ú"test_arf_layout_partial_input_test¤  s    
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_checkN)#Ú__name__Ú
__module__Ú__qualname__Úclassmethodr   r   r1   r<   rA   rB   rO   rY   rZ   r]   r_   r`   rj   rl   rq   rv   rw   r   r€   r‚   r„   rŽ   r˜   r¢   r­   r®   r´   r¸   rÀ   rÂ   rÄ   r   r   r   r   r   
   s@   

			r   c                  C   sr   t  ¡ } | jddd� | jddd� | jddd� | jddd� |  dd	d
g¡ t  | ¡}t|ƒt| ƒksnt‚dS )zSee gh-5123.r   Ús0©Úsubsetr   r   Ús1r!   r   )r   r!   r    N)r   r   rV   r,   r9   rŠ   r0   )r   r   r   r   r   Ú4test_multipartite_layout_nonnumeric_partition_labels·  s    
rÍ   c                  C   sÈ   t  ¡ } tddƒD ]\}}| j||d� qt j| dd�}|d d |d d ksTt‚|d	 d |d d   k r’|d
 d   k r’|d d k s˜n t‚d| jd d< t  | ¡}| ¡ | ¡ ksÄt‚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Ã   r°   rk   r(   rÎ   rÏ   Zlayer_0rË   N)r   r   r¼   rV   r9   r0   ZnodesÚkeys)r   r�   Úlayerr   Z
pos_nosortr   r   r   Ú$test_multipartite_layout_layer_orderÃ  s    D
rÒ   )	Ú__doc__r   Znetworkxr   ZimportorskiprC   r   rÍ   rÒ   r   r   r   r   Ú<module>   s   

   0