
    çgP                         d Z ddlZddlZ ej        d          Z ej        d            G d d          Zd Zd Zd	 Z	ej
                            d
 edd                    d             Zd Zd ZdS )z Unit tests for layout functions.    Nnumpyscipyc                       e Zd Zed             Zd Zd Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d  Z#d! Z$d" Z%d#S )$
TestLayoutc                     t          j        dd          | _        t          j                    | _        t          j        | j        d           t          j        dd          | _        d S )N   abcdef   )nxgrid_2d_graphGiGraphGsadd_pathbigG)clss    ^/var/www/html/ai-engine/env/lib/python3.11/site-packages/networkx/drawing/tests/test_layout.pysetup_classzTestLayout.setup_class   sO    !!Q''
CFH%%%#B++    c                    t          j        d          }t          j        t          t           j        |dg           ddd}t          j        t          t           j        |ddg|           t          j        |dd	g|           d S )
N   r   )fixed   r   r   r   r      r   )r   posr   )r   
path_graphpytestraises
ValueErrorspring_layout)selfGr   s      r   test_spring_fixed_without_posz(TestLayout.test_spring_fixed_without_pos   s    M!j""2AaSAAAAV$$j""2AaVMMMM
1a&c222222r   c                    dd l t          j                    }|                    g d           ddi}dg}t          j        |||          }t          fd|                                D                       }|r
J d            d S )Nr   )r   r   r   r   )r   r   )r              r,   r   r   c              3   L   K   | ]}|D ]}                     |          V  d S N)isnan).0coordscmaths      r   	<genexpr>z2TestLayout.test_spring_init_pos.<locals>.<genexpr>$   s:      OOOO1djjmmOOOOOOOr   zvalues should not be nan)r4   r   r   add_edges_fromfruchterman_reingold_layoutanyvalues)r$   r%   init_pos	fixed_posr   has_nanr4   s         @r   test_spring_init_poszTestLayout.test_spring_init_pos   s    HJJ	999:::z?C	,QHINNNOOOO#**,,OOOOO66666666r   c                    g }t          j        |           t          j        |           t          j        |           t          j        |           t          j        |           t          j        |           t          j        |           t          j        ||           t          j	        |           t          j
        |           t          j        |           d S r/   )r   random_layoutcircular_layoutplanar_layoutr#   r7   spectral_layoutshell_layoutbipartite_layoutspiral_layoutmultipartite_layoutkamada_kawai_layoutr$   r%   s     r   test_smoke_empty_graphz!TestLayout.test_smoke_empty_graph'   s    

1


&q)))
1

Aq!!!

q!!!
q!!!!!r   c                 *   | j         }t          j        |           t          j        |           t          j        |           t          j        |           t          j        |           t          j        |           t          j        | j                   t          j	        |           t          j	        |
                                           t          j	        | j                   t          j	        | j        
                                           t          j        |           t          j        |           t          j        |           t          j        |d           t          j        |d           t          j        |           d S Nr   dimr*   )r   r   r?   r@   rA   r#   forceatlas2_layoutr7   r   rB   to_directedrC   rE   rG   
arf_layoutrH   s     r   test_smoke_intzTestLayout.test_smoke_int5   sR   G

1


a   
&q)))
&ty111
1
1==??+++
49%%%
490022333


q!!!
qa((((
qa((((
ar   c                 $   | j         }t          j        |           t          j        |           t          j        |           t          j        |           t          j        |           t          j        |           t          j        |           t          j	        |           t          j
        |           t          j        |           t          j        |d           t          j        |d           t          j        |           d S rK   )r   r   r?   r@   rA   r#   rN   r7   rB   rC   rE   rG   rP   rH   s     r   test_smoke_stringzTestLayout.test_smoke_stringI   s    G

1


a   
&q)))
1


q!!!
qa((((
qa((((
ar   c                    t                               |          }||z
  }||z   }t                               t          |                                                    }|                    d          |                    d          z
  }|d|z  k                                    sJ ||k                                    sJ ||k                                    sJ d S )Nr   r   )nparraylistr9   maxminall)r$   r   scalecenterlowhivposlengths           r   check_scale_and_centerz!TestLayout.check_scale_and_centerY   s    &!!une^xxSZZ\\**++!txx{{*!e)#((*****  """""
!!!!!!!r   c                    | j         }d}t          j        d          }|                    d            |t          j        ||          dd            |t          j        |d|          d|            |t          j        |d|          d|            |t          j        |d|          d|            |t          j        |d|          d|            |t          j	        |d|          d|            |t          j
        |d|          d|           d} |t          j
        |d	d|
          d|           d S )N)r   r   	   r\         ?)g      @g      @r[   r\   r   )r   r*   r   r*   )rM   r[   r\   ra   r   complete_graphadd_noder?   r#   rB   r@   rC   rE   rG   r$   scr3   r%   s       r   test_scale_and_center_argz$TestLayout.test_scale_and_center_argc   s   (a  	

1
2Aa(((JGGGG
2AQq1111EEEE
2aq3331QGGGG
2aq3331QGGGG
2?1Aa000!DDDD
2AQq1111EEEE
2!!1Q777qKKKK
2!!!A>>>aPQRRRRRRr   c                     t          j        d          }t          j        t           j        t           j        |           d S )Nrc   )r   rh   r    r!   NetworkXExceptionrA   rH   s     r   #test_planar_layout_non_planar_inputz.TestLayout.test_planar_layout_non_planar_inputt   s2    a  b*B,<a@@@@@r   c                     t          j                    }|                    ddgddgddgd           t          j        |           d S )Nr   r   r   r   r   r   )r   PlanarEmbeddingset_datarA   )r$   	embeddings     r   (test_smoke_planar_layout_embedding_inputz3TestLayout.test_smoke_planar_layout_embedding_inputx   sQ    &((	1v1a&aV<<===
#####r   c                 r   | j         }d}t          j        d          }|                    d            |t          j        |          dd            |t          j        |          d|            |t          j        |          d|            |t          j        |          d|            |t          j        |          d|            |t          j	        |          d|            |t          j
        |          d|           d} |t          j
        |d	          d|           d S )
Nr   rc   re   re   re   rf   r   )r   r   r   r*   rL   rg   rj   s       r   test_default_scale_and_centerz(TestLayout.test_default_scale_and_center}   sM   (a  	

1
2Ac*====
2Aa2222
2a  !4444
2a  !4444
2?1Qq1111
2Aa2222
2!!$$Aa8888
2!!+++1Q??????r   c                    t          j        d          }t          j        t          t           j        |d           t          j        t          t           j        |d           t          j        t          t           j        |d           t          j        t          t           j        |d           t          j        t          t           j        |d           d S )Nr   r   rL   r*   )r   r   r    r!   r"   r@   rC   rA   rH   s     r   (test_circular_planar_and_shell_dim_errorz3TestLayout.test_circular_planar_and_shell_dim_error   s    M!j""4aQ????j"/1!<<<<j"/1!<<<<j""2A1====j""2A1======r   c                 b   t          j        | j                  }t           j        j                            |          }|j        dk    sJ t           j        j                            |d          }|j        dk    sJ t           j        j                            |          }|j        dk    sJ d S )N   r   r*   rL   r}   r*   )r   to_numpy_arrayr   drawinglayout_fruchterman_reingoldshape_sparse_fruchterman_reingoldr$   Ar   s      r   test_adjacency_interface_numpyz)TestLayout.test_adjacency_interface_numpy   s    dg&&j55a88yF""""j55aQ5??yF""""j<<Q??yF""""""r   c                 f   t          j        | j        d          }t           j        j                            |          }|j        dk    sJ t           j        j                            |          }|j        dk    sJ t           j        j                            |d          }|j        dk    sJ d S )Nd)dtyper|   r*   rL   r~   )r   to_scipy_sparse_arrayr   r   r   r   r   _sparse_spectralr   s      r   test_adjacency_interface_scipyz)TestLayout.test_adjacency_interface_scipy   s    $TWC888j<<Q??yF""""j0033yF""""j<<QA<FFyF""""""r   c                 F   t          j        d          }t          j        |          }|d                                         rJ t          j        d          }t          j        |dgddgdgg          }|d                                         rJ |d                                         sJ t          j                            |d                   dk    sJ t          j        |dgddgdggd          }t          j                            |d                   dk    sJ d S )Nr   r   r   r   r*   )rotate)r   r   rC   r8   rU   linalgnormr$   r%   r_   s      r   test_single_nodeszTestLayout.test_single_nodes   s   M!q!!7;;==   M!qA3A"4557;;==   Aw{{}}y~~d1g&&!++++qA3A"4Q???y~~d1g&&!++++++r   c                 n    t          j        | j                  }t          j        | j        |          }d S N)r   )r   r@   r   rN   r$   r   nposs      r   "test_smoke_initial_pos_forceatlas2z-TestLayout.test_smoke_initial_pos_forceatlas2   s/     ))$TW#666r   c                 n    t          j        | j                  }t          j        | j        |          }d S r   )r   r@   r   r7   r   s      r   +test_smoke_initial_pos_fruchterman_reingoldz6TestLayout.test_smoke_initial_pos_fruchterman_reingold   s/     ))-dg3???r   c                 n    t          j        | j                  }t          j        | j        |          }d S r   )r   r@   r   rP   r   s      r   test_smoke_initial_pos_arfz%TestLayout.test_smoke_initial_pos_arf   s.     ))}TW#...r   c                    t          j        | j                  }t          j        | j        |dg          }t	          |d                   t	          |d                   k    sJ t          j        | j                  }t          j        | j        |dg          }t          d          D ]6}|d         |         t          j        |d         |         d          k    sJ 7d S )Nr   r-   r   Hz>abs)	r   r@   r   r#   tupler   ranger    approx)r$   r   r   axiss       r   $test_fixed_node_fruchterman_reingoldz/TestLayout.test_fixed_node_fruchterman_reingold   s     ))SAAAS[!!U4<%8%88888 ++	s6(CCC!HH 	T 	TDv;t$d6l46Hd(S(S(SSSSSS	T 	Tr   c                    t          j        d          }t          j        |d           t          j        |d          }t	          |d                   dk    sJ t          j        |d          }t	          |d                   dk    sJ t          j        |d          }t	          |d                   dk    sJ t          j        |d          }t	          |d                   dk    sJ t          j        |d          }t	          |d                   dk    sJ t          j	        |d          }t	          |d                   dk    sJ t          j
        |d          }t	          |d                   dk    sJ d S )Nr   r   rd   r   )r   r   r?   r@   r   rA   r#   r7   rB   rC   rE   r   s      r   test_center_parameterz TestLayout.test_center_parameter   s|   M!
6****!!F333T!W~~''''&111T!W~~''''&111T!W~~''''-a???T!W~~''''!!F333T!W~~''''q000T!W~~''''&111T!W~~''''''r   c                    t          j        d          }t          t           j                  t          t           j                  k    sJ t          j        t          t           j        |d           t          j        t          t           j	        |d           t          j        t          t           j
        |d           t          j        t          t           j        |d           t          j        t          t           j        |dd           t          j        t          t           j        |d           t          j        t          t           j        |dd           t          j        t          t           j        |d           t          j        t          t           j        |d           t          j        t          t           j        |d           d S )Nr   )r   r   r   rd   r*   r   )rM   r\   )r   r   idr#   r7   r    r!   r"   r?   r@   rA   rB   rC   rE   rG   rH   s     r   test_center_wrong_dimensionsz'TestLayout.test_center_wrong_dimensions   sY   M!""##r"*H'I'IIIIIj""2AiHHHHj""4a	JJJJj""2AiHHHHj""2AiHHHHj""2A1VLLLLj""4a	JJJJj""4aQvNNNNj"/1YGGGGj""2AiHHHHj""8!INNNNNNr   c                 .   t          j                    }t          j        |d          }|i k    sJ t          j        |d          }|i k    sJ t          j        |d          }|i k    sJ t          j        ||          }|i k    sJ t          j        |d          }|i k    sJ t          j        |d          }|i k    sJ t          j        |d          }|i k    sJ t          j	        |d          }|i k    sJ t          j
        |d          }|i k    sJ t          j        |d          }|i k    sJ t          j        |d          }|i k    sJ t          j        |          }|i k    sJ t          j        |          }|i k    sJ d S )Nr   rd   )r   empty_graphr?   r@   rA   rD   r#   r7   rB   rC   rE   rF   rG   rN   rP   r   s      r   test_empty_graphzTestLayout.test_empty_graph   s   N&111rzzzz!!F333rzzzz&111rzzzz"1a((rzzzz&111rzzzz-a???rzzzz!!F333rzzzzq000rzzzz&111rzzzz%a777rzzzz%a777rzzzz$Q''rzzzz}Qrzzzzzzr   c                 z   t          j        dd          }t           j                            |          \  }}t          j        ||          }t          |          t          |          k    sJ |t          |          d                  d         }|t          |          d                  d         }|D ]}||         d         |k    sJ |D ]}||         d         |k    sJ t          j        ||dddd          }t          |          t          |          k    sJ |t          |          d                  d         }|t          |          d                  d         }	|D ]}||         d         |k    sJ |D ]}||         d         |	k    sJ t          j        t          t           j        ||d	
           d S )Nr*   r   r   
horizontalr   r   r   r   )alignr\   r[   aspect_ratiofoor   )
r   complete_bipartite_graph	bipartitesetsrD   lenrW   r    r!   r"   )
r$   r%   topbottomr_   top_xbottom_xnodetop_ybottom_ys
             r   test_bipartite_layoutz TestLayout.test_bipartite_layout  s   '1--l''**V"1c**4yyCFF""""T#YYq\"1%VQ(+ 	* 	*D:a=E))))) 	- 	-D:a=H,,,,,"s,vQQ
 
 
 4yyCFF""""T#YYq\"1%VQ(+ 	* 	*D:a=E))))) 	- 	-D:a=H,,,,,j""5q#UKKKKKKr   c                 X   d}t          j        | }t          j        |          t                    t          |          k    sJ d|D ];}|z   }t	          fdt          dz   |          D                       sJ |z  <t          j        |ddd          t                    t          |          k    sJ d|D ];}|z   }t	          fd	t          dz   |          D                       sJ |z  <t          j        t          t           j        |d
           d S )N)r   r      r      r   c              3   T   K   | ]"}         d          |         d          k    V  #dS )r   N r1   istartr_   s     r   r5   z6TestLayout.test_multipartite_layout.<locals>.<genexpr>-  8      SStE{1~a3SSSSSSr   r   r   r   r   )r   r[   r\   c              3   T   K   | ]"}         d          |         d          k    V  #dS )r   Nr   r   s     r   r5   z6TestLayout.test_multipartite_layout.<locals>.<genexpr>6  r   r   r   r   )	r   complete_multipartite_graphrF   r   rZ   r   r    r!   r"   )r$   sizesr%   nendr   r_   s        @@r   test_multipartite_layoutz#TestLayout.test_multipartite_layout#  s_   *E2%a((4yyCFF"""" 	 	A!)CSSSSSU519c=R=RSSSSSSSSQJEE%a|1VTTT4yyCFF"""" 	 	A!)CSSSSSU519c=R=RSSSSSSSSQJEEj""8!5IIIIIIr   c                    t           j        j        j        }t                              ddg          }dt                              ddgddgg          z  } ||t          |dd          \  }}|t          j        d	d
          k    sJ |d         t          j        dd
          k    sJ |d         t          j        dd
          k    sJ d S )Ng      @g      @r   皙?g       @333333?r   
meanweightrM   g      ?r   r         re   )r   r   r   _kamada_kawai_costfnrU   rV   r    r   )r$   costfnr   invdistcostgrads         r   test_kamada_kawai_costfn_1dz&TestLayout.test_kamada_kawai_costfn_1d;  s    "7hhSz""bhhc
S#J7888VCWBBB
dv}&8tDDDDDDDAw&-D9999999Aw&-666666666r   c           
      >   t           j        j        j        } ||                                t
          |||          \  }}d|z  t
                              t
                              |d          dz            z  }t          |j        d                   D ]k}	t          |	dz   |j        d                   D ]J}
t
          j	        
                    ||	         ||
         z
            }||||	         |
         z  dz
  dz  z  }Kl|t          j        |d	          k    sJ d
}t          |j        d                   D ]}t          |j        d                   D ]}||j        d         z  |z   }|                                }||xx         |z  cc<    ||t
          |||j        d                   d         }||xx         d|z  z  cc<    ||t
          |||j        d                   d         }||         t          j        ||z
  d|z  z  d	          k    sJ Čd S )Nr   re   r   r   r   r         ?r   r   g-C6?gh㈵>)r   r   r   r   ravelrU   sumr   r   r   r   r    r   flatten)r$   r   r   meanwtrM   r   r   r   expected_costr   jdiffdxnddmidxpscpluscminuss                      r   check_kamada_kawai_costfnz$TestLayout.check_kamada_kawai_costfnG  s;   "7VCIIKKWSQQQ
dfrvvbffSqf.A.AQ.F'G'GGsy|$$ 	C 	CA1q5#)A,// C Cy~~c!fs1vo66$A"6"<!BBC v}]=======	!%% 	Y 	YBCIaL)) 
Y 
Y39Q<'",[[]]32r2w6syQR|TTTUVW31r6!BF	RSUUUVWXCyFM56>a"f2MSW$X$X$XXXXXX
Y	Y 	Yr   c                 B   dt                               g dg dg dg          z  }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*   )rU   rV   r   )r$   r   r   r   s       r   test_kamada_kawai_costfnz#TestLayout.test_kamada_kawai_costfnb  s    bhh///RSSS hhdc4[3*=>>&&sGVQ??? hh(((*;*;*;=M=M=MNOO&&sGVQ?????r   c                    | j         }t                              t          t	          j        |d                                                              }t                              t          t	          j        |d                                                              }t          j                            |d d         |dd          z
  d          }t          j                            |d d         |dd          z
  d          }t          |          t          |          k    sJ t                              t          t	          j        |d                                                              }t          j                            |d d         |dd          z
  d          }t          
                    |dd          |d         d	
          sJ d S )Ngffffff?)
resolutiong(\?r   r   Tequidistantg{Gz?atol)r   rU   rV   rW   r   rE   r9   r   r   r   allclose)r$   r%   pos_standardpos_tighter	distancesdistances_tighterpos_equidistantdistances_equidistants           r   test_spiral_layoutzTestLayout.test_spiral_layoutp  s   G xxR%5aD%I%I%I%P%P%R%R S STThhtB$4Q4$H$H$H$O$O$Q$QRRSSINN<#4|ABB7G#GaNPP	INN;ss+;k!""o+MTUNVV9~~$5 6 66666 ((4(8(M(M(M(T(T(V(V#W#WXX "	CRC ?122#66Q !/ !
 !
 {{!!""%'<R'@t  
 
 	
 	
 	
 	
 	
r   c                    t          j        d          }t          j        |d          }t                              t          |                                                    }t          j                            |dd          |d d         z
  d          }t          	                    t          
                    |          dd	          sJ d S )
N
   Tr   r   r   r   r   gMbP?r   )r   r   rE   rU   rV   rW   r9   r   r   r   r   )r$   r%   r   pdists        r   test_spiral_layout_equidistantz)TestLayout.test_spiral_layout_equidistant  s    M"qd333HHT#**,,''((y~~aeafn1~55{{2774==!${7777777r   c                     | j         }t          j                            |          }t          j        |          }||= t          j        ||          }t          |          t          |          k    sJ d S r   )r   r   utilsarbitrary_elementr@   rN   r   r$   r%   r   r   s       r   *test_forceatlas2_layout_partial_input_testz5TestLayout.test_forceatlas2_layout_partial_input_test  sm    Gx))!,, ##I#A3///3xx3q66!!!!!!r   c                    t          j                    }t          j        |d          }t          j        |          i k    sJ t          j        d          }ddd}t          j        |          }t          j                            d t          |                                 D                       dk     sJ t          j        d	          }d
ddd}t          j        |          }t          	                    d          t          	                    d          t          	                    d
          d}|
                                D ]%\  }}||         |k                                    sJ &t          j        |d          }t          	                    d          t          	                    d          t          	                    d
          d}|
                                D ]%\  }}||         |k                                    sJ &d S )Nr   rd   r   r+   )r   r   r(   c                 ,    g | ]}t          |          S r   )r   )r1   xs     r   
<listcomp>z7TestLayout.test_rescale_layout_dict.<locals>.<listcomp>  s    EEE!s1vvEEEr   gư>r*   r   rw   rq   )r   r   )r[   )r  r   )r   r   r?   rescale_layout_dictrU   r   r   zipr9   rV   itemsrZ   )r$   r%   r_   s_vposexpectationkvs          r   test_rescale_layout_dictz#TestLayout.test_rescale_layout_dict  s   N&111%d++r1111N1*--'--y~~EEsFMMOO/DEEEFFMMMMN1f44'-- xx!!xxxx
 

  %%'' 	* 	*DAq1IN''))))))'A666xx!!xxxx
 

  %%'' 	* 	*DAq1IN''))))))	* 	*r   c                     | j         }t          j                            |          }t          j        |          }||= t          j        ||          }t          |          t          |          k    sJ d S r   )r   r   r  r	  r@   rP   r   r
  s       r   "test_arf_layout_partial_input_testz-TestLayout.test_arf_layout_partial_input_test  sl    Gx))!,, ##ImA3'''3xx3q66!!!!!!r   c                 b    | j         }t          j        t          t          j        |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   rP   rH   s     r    test_arf_layout_negative_a_checkz+TestLayout.test_arf_layout_negative_a_check  s,     Gj"-1;;;;;;r   c                     | j         }t          j        |d           t          j        |d           t          j        |d           t          j        |d           d S )N*   )seed)r   r   r?   r#   rP   rN   rH   s     r   test_smoke_seed_inputz TestLayout.test_smoke_seed_input  sf    G
$$$$
$$$$
ab!!!!
ab))))))r   N)&__name__
__module____qualname__classmethodr   r&   r=   rI   rQ   rS   ra   rl   ro   ru   rx   rz   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      s:       , , [,3 3 37 7 7" " "  (   " " "S S S"A A A$ $ $
@ @ @ > > ># # ## # #
, 
, 
,7 7 7@ @ @/ / /	T 	T 	T( ( ($O O O  :L L L8J J J0
7 
7 
7Y Y Y6@ @ @
 
 
,8 8 8" " "* * *<" " "< < <* * * * *r   r   c                  ~   t          j                    } |                     dd           |                     dd           |                     dd           |                     dd           |                     g d           t          j        |           }t          |          t          |           k    sJ d	S )
zSee gh-5123.r   s0subsetr   r   s1r*   )r   )r   r*   r)   N)r   r   ri   r6   rF   r   )r%   r   s     r   4test_multipartite_layout_nonnumeric_partition_labelsr+    s    


AJJqJJJqJJJqJJJqJ---...

 
#
#Cs88s1vvr   c                     t          j                    } t          t          dd                    }|                                D ]\  }}|                     ||           t          j        | d          }t           j                            |          }t          j        | d|          }t          |                                |                                          D ]+\  \  }}\  }	}
||	k    r||
k    	                                sJ ,|d         d         |d	         d         k    sJ |d
         d         |d         d         cxk     r%|d         d         cxk     r|d         d         k     sn J d| j
        d         d<   t          j        |           }|                                |                                k    sJ dS )zgReturn the layers in sorted order if the layers of the multipartite
    graph are sortable. See gh-5691)r  br3   r   e)r   r*   r   r   r   r(  r   r   )r   
subset_keyr  r   r   r3   r-  r.  layer_0r)  N)r   r   dictr  r  ri   rF   r  groupsrZ   nodeskeys)r%   
node_groupr   layerr   layerspos_from_layersn1p1n2p2
pos_nosorts               r   $test_multipartite_layout_layer_orderr>    s    	

Ac3_EEFFJ!'')) ' 'e	

4
&&&& 
 ,
7
7
7CX__Z((F,QlvVVVO!#))++/D/D/F/FGG - -R(2rRxxR2XNN,,xxxx s8B<3s8B<''''s8B<#c(2,DDDDS"DDDDCDDDDDD 'AGCL'**J??

******r   c                     t                               t          |                                                     dddf         }t                               |d          \  }}|S )zJHelper function to extract the number of nodes in each layer of bfs_layoutNr   T)return_counts)rU   rV   rW   r9   unique)r   r  _layer_counts       r   _num_nodes_per_bfs_layerrD    sO    
cjjll##$$QQQT*AYYqY55NA{r   r   r   r   c                     t          j        |           }t          j        |d          }t                              t          |          d| dz
  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   rh   
bfs_layoutrU   array_equalrD  )r   r%   r   s      r   test_bfs_layout_complete_graphrI    sY     	!A
-
#
#
#C>>2377!QUDDDDDDDr   c                     t          j        dd          } t          j        | d          }g d}t                              t          |          |          sJ t          j        | d          }t                              t          |          |          sJ t          j        | d          }g d}t                              t          |          |          sJ d S )	Nr   r*   r   rF  )r   r   r   r   r   r   r      r}   )r   r   r   r   )r   barbell_graphrG  rU   rH  rD  )r%   r   expected_nodes_per_layers      r   test_bfs_layout_barbellrN    s    
AA
-
#
#
#C444>>23779QRRRRR
-
$
$
$C>>23779QRRRRR
-
#
#
#C+||>>23779QRRRRRRRr   c                      t          j        d          } |                     ddg           t          j        t           j        d          5  t          j        | d           d d d            d S # 1 swxY w Y   d S )Nr   )r     )rP  rK  z#bfs_layout didn't include all nodes)matchr   rF  )r   rh   r6   r    r!   NetworkXErrorrG  )r%   s    r   test_bfs_layout_disconnectedrS    s    
!Ah)***	r'/T	U	U	U " "
aq!!!!" " " " " " " " " " " " " " " " " "s   A00A47A4)__doc__r    networkxr   importorskiprU   r   r+  r>  rD  markparametrizer   rI  rN  rS  r   r   r   <module>rY     s	   & &     V!!  G   @* @* @* @* @* @* @* @*F	 	 	+ + +6   eeAqkk**E E +*ES S S"" " " " "r   