
    Vh\                        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                  j                  d
 edd            d        Zd Zd Zd Zd Zej                  j                  dej$                  ej&                  ej(                  ej*                  ej,                  ej.                  ej0                  ej2                  ej4                  g	      d        Zej                  j                  dddg      ej                  j                  di ddidgdddig      d               Zy)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# Z&d$ Z'y%)&
TestLayoutc                     t        j                  dd      | _        t        j                         | _        t        j
                  | j                  d       t        j                  dd      | _        y )N   abcdef   )nxgrid_2d_graphGiGraphGsadd_pathbigG)clss    R/home/dcms/DCMS/lib/python3.12/site-packages/networkx/drawing/tests/test_layout.pysetup_classzTestLayout.setup_class   sI    !!!Q'
CFFH%##B+    c                    t        j                  d      }t        j                  t        d      5  t        j
                  |dg       d d d        dddt        j                  t        d      5  t        j
                  |dd	g
       d d d        t        j
                  |ddg
      t        fddD              sJ y # 1 sw Y   ~xY w# 1 sw Y   GxY w)N   z!nodes are fixed without positionsmatchr   )fixed   r   r   r   r      r   )r   posr   c              3   V   K   | ]   }t         j                  |   |          " y wN)nparray_equal).0noutr    s     r   	<genexpr>z;TestLayout.test_spring_fixed_without_pos.<locals>.<genexpr>    s$     Ba2>>#a&#a&1Bs   &))r   
path_graphpytestraises
ValueErrorspring_layoutall)selfGr'   r    s     @@r   test_spring_fixed_without_posz(TestLayout.test_spring_fixed_without_pos   s    MM!]]:-PQ 	+Qqc*	+ V$]]:-PQ 	7Qq!f#6	7 qAC8B6BBBB	+ 	+
	7 	7s   C	4C	CCc                     dd l t        j                         }|j                  g d       ddi}dg}t        j                  |||      }t        fd|j                         D              }|rJ d       y )Nr   )r   r   r   r   )r   r   )r              r7   r    r   c              3   N   K   | ]  }|D ]  }j                  |         y wr"   )isnan)r%   coordscmaths      r   r(   z2TestLayout.test_spring_init_pos.<locals>.<genexpr>,   s%     OO1djjmOmOs   "%zvalues should not be nan)r=   r   r   add_edges_fromfruchterman_reingold_layoutanyvalues)r/   r0   init_pos	fixed_posr    has_nanr=   s         @r   test_spring_init_poszTestLayout.test_spring_init_pos"   sj    HHJ	9:z?C	,,QHINO#**,OO666{7r   c                    g }t        j                  |       t        j                  |       t        j                  |       t        j                  |       t        j
                  |       t        j                  |       t        j                  |       t        j                  ||       t        j                  |       t        j                  |       t        j                  |       y r"   )r   random_layoutcircular_layoutplanar_layoutr-   r?   spectral_layoutshell_layoutbipartite_layoutspiral_layoutmultipartite_layoutkamada_kawai_layoutr/   r0   s     r   test_smoke_empty_graphz!TestLayout.test_smoke_empty_graph/   s    

1


&&q)
1

Aq!

q!
q!r   c                 b   | j                   }t        j                  |       t        j                  |       t        j                  |       t        j
                  |       t        j                  |       t        j                  |       t        j                  | j                         t        j                  |       t        j                  |j                                t        j                  | j                         t        j                  | j                  j                                t        j                  |       t        j                  |       t        j                  |       t        j                  |d       t        j                  |d       t        j                  |       y Nr   dimr5   )r   r   rG   rH   rI   r-   forceatlas2_layoutr?   r   rJ   to_directedrK   rM   rO   
arf_layoutrP   s     r   test_smoke_intzTestLayout.test_smoke_int=   s   GG

1


a 
&&q)
&&tyy1
1
1==?+
499%
4990023


q!
qa(
qa(
ar   c                 F   | 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                  |       y rS   )r   r   rG   rH   rI   r-   rV   r?   rJ   rK   rM   rO   rX   rP   s     r   test_smoke_stringzTestLayout.test_smoke_stringQ   s    GG

1


a 
&&q)
1


q!
qa(
qa(
ar   c                 d   t         j                  |      }||z
  }||z   }t         j                  t        |j                                     }|j	                  d      |j                  d      z
  }|d|z  k  j                         sJ ||k\  j                         sJ ||k  j                         sJ y )Nr   r   )r#   arraylistrA   maxminr.   )r/   r    scalecenterlowhivposlengths           r   check_scale_and_centerz!TestLayout.check_scale_and_centera   s    &!une^xxSZZ\*+!txx{*!e)#((***  """
!!!r   c                    | j                   }d}t        j                  d      }|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|       d} |t        j                  |d	d|
      d|       y )N)r   r   	   rb         ?)g      @g      @ra   rb   r   )r   r5   r   r5   )rU   ra   rb   rg   r   complete_graphadd_noderG   r-   rJ   rH   rK   rM   rO   r/   scr<   r0   s       r   test_scale_and_center_argz$TestLayout.test_scale_and_center_argk   s	   ((a 	

1
2Aa(JG
2AQq11E
2aq31QG
2aq31QG
2??1Aa0!D
2AQq11E
2!!!1Q7qK
2!!!!A>aPQRr   c                     t        j                  d      }t        j                  t         j                  t         j
                  |       y )Nri   )r   rn   r*   r+   NetworkXExceptionrI   rP   s     r   #test_planar_layout_non_planar_inputz.TestLayout.test_planar_layout_non_planar_input|   s.    a b**B,<,<a@r   c                     t        j                         }|j                  ddgddgddgd       t        j                  |       y )Nr   r   r   r   r   r   )r   PlanarEmbeddingset_datarI   )r/   	embeddings     r   (test_smoke_planar_layout_embedding_inputz3TestLayout.test_smoke_planar_layout_embedding_input   s?    &&(	1v1a&aV<=
#r   c                 T   | j                   }d}t        j                  d      }|j                  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|       y )
Nr   ri   rk   rk   rk   rl   r   )r   r   r   r5   rT   rm   rp   s       r   test_default_scale_and_centerz(TestLayout.test_default_scale_and_center   s    ((a 	

1
2Ac*=
2Aa2
2a !4
2a !4
2??1Qq1
2Aa2
2!!!$Aa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       y )Nr   r   rT   r5   )r   r)   r*   r+   r,   rH   rK   rI   rP   s     r   (test_circular_planar_and_shell_dim_errorz3TestLayout.test_circular_planar_and_shell_dim_error   s    MM!j""4"4aQ?j"//1!<j"//1!<j""2"2A1=j""2"2A1=r   c                    t        j                  | j                        }t         j                  j                  j                  |      }|j                  dk(  sJ t         j                  j                  j                  |d      }|j                  dk(  sJ t         j                  j                  j                  |      }|j                  dk(  sJ y )N   r   r5   rT   r   r5   )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    dgg&jj55a8yyF"""jj55aQ5?yyF"""jj<<Q?yyF"""r   c                    t        j                  | j                  d      }t         j                  j                  j                  |      }|j                  dk(  sJ t         j                  j                  j                  |      }|j                  dk(  sJ t         j                  j                  j                  |d      }|j                  dk(  sJ y )Nd)dtyper   r5   rT   r   )r   to_scipy_sparse_arrayr   r   r   r   r   _sparse_spectralr   s      r   test_adjacency_interface_scipyz)TestLayout.test_adjacency_interface_scipy   s    $$TWWC8jj<<Q?yyF"""jj003yyF"""jj<<QA<FyyF"""r   c                    t        j                  d      }t        j                  |      }|d   j                         rJ t        j                  d      }t        j                  |dgddgdgg      }|d   j                         rJ |d   j                         sJ t        j
                  j                  |d         dk  sJ t        j                  |dgddgdggd      }t        j
                  j                  |d         dk  sJ y )Nr   r   r   r   r5   )rotate)r   r)   rK   r@   r#   linalgnormr/   r0   re   s      r   test_single_nodeszTestLayout.test_single_nodes   s    MM!q!7;;=  MM!qA3A"457;;=  Aw{{}}yy~~d1g&!+++qA3A"4Q?yy~~d1g&!+++r   c                     t        j                  | j                        }t        j                  | j                  |      }y Nr    )r   rH   r   rV   r/   r    nposs      r   "test_smoke_initial_pos_forceatlas2z-TestLayout.test_smoke_initial_pos_forceatlas2   s,      )$$TWW#6r   c                     t        j                  | j                        }t        j                  | j                  |      }y r   )r   rH   r   r?   r   s      r   +test_smoke_initial_pos_fruchterman_reingoldz6TestLayout.test_smoke_initial_pos_fruchterman_reingold   s,      )--dgg3?r   c                     t        j                  | j                        }t        j                  | j                  |      }y r   )r   rH   r   rX   r   s      r   test_smoke_initial_pos_arfz%TestLayout.test_smoke_initial_pos_arf   s*      )}}TWW#.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 ]*  }|d   |   t        j                  |d   |   d      k(  r*J  y )Nr   r8   r   Hz>abs)	r   rH   r   r-   tupler   ranger*   approx)r/   r    r   axiss       r   $test_fixed_node_fruchterman_reingoldz/TestLayout.test_fixed_node_fruchterman_reingold   s      )SAS[!U4<%8888  +		s6(C!H 	TDv;t$d6l46Hd(SSSS	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 y )Nr   r   rj   r   )r   r)   rG   rH   r   rI   r-   r?   rJ   rK   rM   r   s      r   test_center_parameterz TestLayout.test_center_parameter   s6   MM!
6*!!!F3T!W~'''&1T!W~'''&1T!W~'''--a?T!W~'''!!!F3T!W~'''q0T!W~'''&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       y )Nr   )r   r   r   rj   r5   r   )rU   rb   )r   r)   idr-   r?   r*   r+   r,   rG   rH   rI   rJ   rK   rM   rO   rP   s     r   test_center_wrong_dimensionsz'TestLayout.test_center_wrong_dimensions   s&   MM!"""#r"*H*H'IIIIj""2"2AiHj""4"4a	Jj""2"2AiHj""2"2AiHj""2"2A1VLj""4"4a	Jj""4"4aQvNj"//1YGj""2"2AiHj""8"8!I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 y )Nr   rj   )r   empty_graphrG   rH   rI   rL   r-   r?   rJ   rK   rM   rN   rO   rV   rX   r   s      r   test_empty_graphzTestLayout.test_empty_graph   s   NN&1rzz!!!F3rzz&1rzz""1a(rzz&1rzz--a?rzz!!!F3rzzq0rzz&1rzz%%a7rzz%%a7rzz$$Q'rzz}}Qrzzr   c                    t        j                  dd      }t         j                  j                  |      \  }}t        j                  ||      }t        |      t        |      k(  sJ |t        |      d      d   }|t        |      d      d   }|D ]  }||   d   |k(  rJ  |D ]  }||   d   |k(  rJ  t        j                  ||dddd      }t        |      t        |      k(  sJ |t        |      d      d   }|t        |      d      d   }	|D ]  }||   d   |k(  rJ  |D ]  }||   d   |	k(  rJ  t        j                  t        t         j                  ||d	
       y )Nr5   r   r   
horizontalr   r   r   r   )alignrb   ra   aspect_ratiofoor   )
r   complete_bipartite_graph	bipartitesetsrL   lenr^   r*   r+   r,   )
r/   r0   topbottomre   top_xbottom_xnodetop_ybottom_ys
             r   test_bipartite_layoutz TestLayout.test_bipartite_layout  s   ''1-ll''*V""1c*4yCF"""T#Yq\"1%VQ(+ 	*D:a=E)))	* 	-D:a=H,,,	- ""s,vQQ
 4yCF"""T#Yq\"1%VQ(+ 	*D:a=E)))	* 	-D:a=H,,,	- 	j""5"5q#UKr   c                 "   d}t        j                  | }t        j                  |      t              t        |      k(  sJ d|D ]0  }|z   }t	        fdt        dz   |      D              sJ |z  2 t        j                  |ddd      t              t        |      k(  sJ d|D ]0  }|z   }t	        fd	t        dz   |      D              sJ |z  2 t        j                  t        t         j                  |d
       y )N)r   r      r      r   c              3   @   K   | ]  }   d    |   d    k(    ywr   N r%   istartre   s     r   r(   z6TestLayout.test_multipartite_layout.<locals>.<genexpr>5  &     StE{1~a3S   r   r   r   r   )r   ra   rb   c              3   @   K   | ]  }   d    |   d    k(    yw)r   Nr   r   s     r   r(   z6TestLayout.test_multipartite_layout.<locals>.<genexpr>>  r   r   r   r   )	r   complete_multipartite_graphrN   r   r.   r   r*   r+   r,   )r/   sizesr0   r&   endr   re   s        @@r   test_multipartite_layoutz#TestLayout.test_multipartite_layout+  s   **E2%%a(4yCF""" 	A!)CSU519c=RSSSSQJE	
 %%a|1VT4yCF""" 	A!)CSU519c=RSSSSQJE	
 	j""8"8!5Ir   c                    t         j                  j                  j                  }t        j                  ddg      }dt        j                  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 y )Ng      @g      @r   皙?g       @333333?r   
meanweightrU   g      ?r   r         rk   )r   r   r   _kamada_kawai_costfnr#   r]   r*   r   )r/   costfnr    invdistcostgrads         r   test_kamada_kawai_costfn_1dz&TestLayout.test_kamada_kawai_costfn_1dC  s    ""77hhSz"bhhc
S#J788CWB
dv}}&8tDDDDAw&--D9999Aw&--6666r   c           
         t         j                  j                  j                  } ||j	                         t
        |||      \  }}d|z  t
        j                  t
        j                  |d      dz        z  }t        |j                  d         D ]_  }	t        |	dz   |j                  d         D ]>  }
t
        j                  j                  ||	   ||
   z
        }||||	   |
   z  dz
  dz  z  }@ a |t        j                  |d	      k(  sJ d
}t        |j                  d         D ]  }t        |j                  d         D ]  }||j                  d   z  |z   }|j                         }||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(  rJ   y )Nr   rk   r   r   r   r         ?r   r   g-C6?h㈵>)r   r   r   r   ravelr#   sumr   r   r   r   r*   r   flatten)r/   r    r   meanwtrU   r   r   r   expected_costr   jdiffdxnddmidxpscpluscminuss                      r   check_kamada_kawai_costfnz$TestLayout.check_kamada_kawai_costfnO  s   ""77CIIKWSQ
dfrvvbffSqf.AQ.F'GGsyy|$ 	CA1q5#))A,/ Cyy~~c!fs1vo6$A"6"<!BBC	C
 v}}]====		!% 	YBCIIaL) 
Y399Q<'",[[]32r2w6syyQR|TUVW31r6!BF		RSUVWXCyFMM56>a"f2MSW$XXXX
Y	Yr   c                    dt         j                  g dg dg dg      z  }d}t         j                  ddgdd	gd
dgg      }| j                  |||d       t         j                  g dg dg dg      }| j                  |||d       y )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?r5   )r#   r]   r   )r/   r   r   r    s       r   test_kamada_kawai_costfnz#TestLayout.test_kamada_kawai_costfnj  s    bhh/RSS hhdc4[3*=>&&sGVQ? hh(*;=MNO&&sGVQ?r   c                    | j                   }t        j                  t        t	        j
                  |d      j                                     }t        j                  t        t	        j
                  |d      j                                     }t        j                  j                  |d d |dd  z
  d      }t        j                  j                  |d d |dd  z
  d      }t        |      t        |      kD  sJ t        j                  t        t	        j
                  |d      j                                     }t        j                  j                  |d d |dd  z
  d      }t        j                  |dd  |d   d	
      sJ y )Ngffffff?)
resolutiong(\?r   r   T)equidistantg{Gz?atol)r   r#   r]   r^   r   rM   rA   r   r   r   allclose)r/   r0   pos_standardpos_tighter	distancesdistances_tighterpos_equidistantdistances_equidistants           r   test_spiral_layoutzTestLayout.test_spiral_layoutx  sV   GG xxR%5%5aD%I%P%P%R SThhtB$4$4Q4$H$O$O$QRSIINN<#4|AB7G#GaNP	IINN;s+;k!"o+MTUNV9~$5 6666 ((4(8(8(M(T(T(V#WX "		CR ?12#66Q !/ !
 {{!!"%'<R'@t  
 	
 
r   c                    t        j                  d      }t        j                  |dd       t        j                  |d      }t        j                  t        |j                                     }t        j                  j                  |dd  |d d z
  d      }t        j                  t        j                  |      dd	
      sJ y )N
   Tr    )r   store_pos_asr   r   r   r   gMbP?r   )r   r)   rM   get_node_attributesr#   r]   r^   rA   r   r   r  r   )r/   r0   r    pdists        r   test_spiral_layout_equidistantz)TestLayout.test_spiral_layout_equidistant  s    MM"
5A$$Q.HHT#**,'(yy~~aeafn1~5{{2774=!${777r   c                     | j                   }t        j                  j                  |      }t        j                  |      }||= t        j
                  ||      }t        |      t        |      k(  sJ y r   )r   r   utilsarbitrary_elementrH   rV   r   r/   r0   r   r    s       r   *test_forceatlas2_layout_partial_input_testz5TestLayout.test_forceatlas2_layout_partial_input_test  s^    GGxx))!,  #I##A3/3x3q6!!!r   c                    t        j                         }t        j                  |d      }t        j                  |      i k(  sJ t        j                  d      }ddd}t        j                  |      }t        j
                  j                  t        |j                          D cg c]  }t        |       c}      dk  sJ t        j                  d      }d	dd
d}t        j                  |      }t        j                  d      t        j                  d      t        j                  d	      d}|j                         D ]  \  }}||   |k(  j                         rJ  t        j                  |d      }t        j                  d      t        j                  d      t        j                  d	      d}|j                         D ]  \  }}||   |k(  j                         rJ  y c c}w )Nr   rj   r   r6   )r   r   r3   gư>r5   r   r}   rw   )r   r   )ra   )r  r   )r   r   rG   rescale_layout_dictr#   r   r   ziprA   r   r]   itemsr.   )r/   r0   re   s_vposxexpectationkvs           r   test_rescale_layout_dictz#TestLayout.test_rescale_layout_dict  s   NN&1%%d+r111NN1*-''-yy~~sFMMO/DE!s1vEFMMMNN1f4''- xx!xxxx

  %%' 	*DAq1IN'')))	*''A6xx!xxxx

  %%' 	*DAq1IN'')))	*' Fs   &G*c                     | j                   }t        j                  j                  |      }t        j                  |      }||= t        j
                  ||      }t        |      t        |      k(  sJ y r   )r   r   r  r  rH   rX   r   r  s       r   "test_arf_layout_partial_input_testz-TestLayout.test_arf_layout_partial_input_test  s\    GGxx))!,  #ImmA3'3x3q6!!!r   c                 r    | j                   }t        j                  t        t        j
                  |d       y)zl
        Checks input parameters correctly raises errors. For example,  `a` should be larger than 1
        r   )r0   aN)r   r*   r+   r,   r   rX   rP   s     r    test_arf_layout_negative_a_checkz+TestLayout.test_arf_layout_negative_a_check  s#     GGj"--1;r   c                     | j                   }t        j                  |d       t        j                  |d       t        j                  |d       t        j
                  |d       y )N*   )seed)r   r   rG   r-   rX   rV   rP   s     r   test_smoke_seed_inputz TestLayout.test_smoke_seed_input  sI    GG
$
$
ab!
ab)r   c                     t        j                  d      }t        d      D ci c]
  }||dz
  dg }}t        j                  ||      }y c c}w )Nr5   r   r7   r   r   r)   r   rV   r/   r0   r   orig_posnew_poss        r   test_node_at_centerzTestLayout.test_node_at_center  sJ    MM!-21X6AAs|O66''x8 7s   Ac                     t        j                  d      }t        d      D ci c]
  }||dz
  dg }}t        j                  ||d      }y c c}w )Nr5   r   r   r7   r'  )r    r(  r+  r,  s        r   test_initial_only_some_posz%TestLayout.test_initial_only_some_pos  sL    MM!-21X6AAs|O66''xbA 7s   AN)(__name__
__module____qualname__classmethodr   r1   rE   rQ   rY   r[   rg   rr   ru   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/  r1  r   r   r   r   r      s    , ,C7"( "S"A$
@ >##
,7@/	T($O:L8J0
7Y6@
,8"*<"<*9Br   r   c                  F   t        j                         } | j                  dd       | j                  dd       | j                  dd       | j                  dd       | j                  g d       t        j                  |       }t        |      t        |       k(  sJ y	)
zSee gh-5123.r   s0subsetr   r   s1r5   )r   )r   r5   r4   N)r   r   ro   r>   rN   r   r0   r    s     r   4test_multipartite_layout_nonnumeric_partition_labelsr<    s    

AJJqJJJqJJJqJJJqJ-.

 
 
#Cs8s1vr   c                     t        j                         } t        t        dd            }|j	                         D ]  \  }}| j                  ||        t        j                  | d      }t         j                  j                  |      }t        j                  | d|      }t        |j	                         |j	                               D ]%  \  \  }}\  }	}
||	k(  r||
k(  j                         r%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J  J d| j                  d   d<   t        j                  |       }|j                         |j                         k(  sJ y)zgReturn the layers in sorted order if the layers of the multipartite
    graph are sortable. See gh-5691)r$  br<   r   e)r   r5   r   r   r   r8  r   r   )r   
subset_keyr$  r   r   r<   r>  r?  layer_0r9  N)r   r   dictr  r  ro   rN   r  groupsr.   nodeskeys)r0   
node_groupr   layerr    layerspos_from_layersn1p1n2p2
pos_nosorts               r   $test_multipartite_layout_layer_orderrO    sp    	
Ac3_EFJ!'') 'e	

4
&' 
 
 ,
7CXX__Z(F,,QlvVO!#))+/D/D/FG -R(2rRxR2XNN,,,- s8B<3s8B<'''s8B<#c(2,DS"DCDDDDD 'AGGCL''*J??
***r   c                     t         j                  t        | j                                     dddf   }t         j	                  |d      \  }}|S )zJHelper function to extract the number of nodes in each layer of bfs_layoutNr   T)return_counts)r#   r]   r^   rA   unique)r    r  _layer_counts       r   _num_nodes_per_bfs_layerrU  	  s@    
cjjl#$QT*AYYqY5NA{r   r&   r   r   c                     t        j                  |       }t        j                  |dd       t        j                  |d      }t        j                  t        |      d| dz
  g      sJ y)zrThe complete graph should result in two layers: the starting node and
    a second layer containing all neighbors.r   r    )r   r  r   N)r   rn   
bfs_layoutr  r#   r$   rU  )r&   r0   r    s      r   test_bfs_layout_complete_graphrX    sX     	!AMM!151

 
 E
*C>>237!QUDDDr   c                     t        j                  dd      } t        j                  | d      }g d}t        j	                  t        |      |      sJ t        j                  | d      }t        j	                  t        |      |      sJ t        j                  | d      }g d}t        j	                  t        |      |      sJ y )	Nr   r5   r   r   )r   r   r   r   r   r   r      r   )r   r   r   r   )r   barbell_graphrW  r#   r$   rU  )r0   r    expected_nodes_per_layers      r   test_bfs_layout_barbellr^    s    
AA
--
#C4>>2379QRRR
--
$C>>2379QRRR
--
#C+>>2379QRRRr   c                      t        j                  d      } | j                  ddg       t        j                  t         j
                  d      5  t        j                  | d       d d d        y # 1 sw Y   y xY w)Nr   )r     )r`  r[  z#bfs_layout didn't include all nodesr   r   rZ  )r   rn   r>   r*   r+   NetworkXErrorrW  )r0   s    r   test_bfs_layout_disconnectedrb  +  s]    
!Ah)*	r''/T	U "
aq!" " "s   A//A8c                      t        j                  d      } t        j                  t         j                  d      5  t        j
                  |        d d d        t        j
                  | ddg      }y # 1 sw Y   #xY w)Nr   zGraph is not bipartiter   r   r5   )rD  )r   rn   r*   r+   ra  rL   r;  s     r   >test_bipartite_layout_default_nodes_raises_non_bipartite_inputrd  2  sb    
!A	r''/G	H 
A 

a1v
.C s   A33A<c                     t        j                  dd      } t        j                  |       }t         j                  j	                  |       D ].  }|D cg c]
  }||   d    c}t        fdD              r.J  y c c}w )Nr5   r   c              3   T   K   | ]  }|t        j                  d          k(   ! ywr   )r*   r   )r%   r  xss     r   r(   z6test_bipartite_layout_default_nodes.<locals>.<genexpr>@  s#     91be,,9s   %()r   r   rL   r   r   r.   )r0   r    nodesetr  rg  s       @r   #test_bipartite_layout_default_nodesri  :  sr    
##Aq)A


a
 C<<$$Q' :!()Ac!fQi)9b9999:)s   A>r   c                     t        j                  d      }dj                  g d      }t        j                  t
        |      5   | |d       ddd       y# 1 sw Y   yxY w)z>Test all layouts that support dim kwarg handle invalid inputs.r   |)z negative dimensions.*not allowedzcan only handle 2zcannot handle.*2r   r   rT   N)r   r)   joinr*   r+   r,   )r   r0   valid_err_msgss      r   test_layouts_negative_dimrn  C  sT      	aAXX	
N 
z	8 qb  s   AA!)	num_nodesexpected_method)d   force)i  energyextra_layout_kwargsr   r8   rU   r5   c                 &   t        j                  |       }d}t        j                  |f||d|}t        j                  |fd|d|}t        j	                  t        |j                               t        |j                               d      sJ y)z;Expect 'force' layout for n < 500 and 'energy' for n >= 500ix	)methodr(  autor   r   N)r   cycle_graphr-   r#   r  r^   rA   )ro  rp  rt  r0   r(  expectedactuals          r   'test_spring_layout_graph_size_heuristicr{  _  s     	y!AD 	!0CH aQTQ=PQF;;tHOO-.V]]_0ED;QQQr   )__doc__r*   networkxr   importorskipr#   r   r<  rO  rU  markparametrizer   rX  r^  rb  rd  ri  rG   rH   rK   r-   rO   rJ   rI   rM   rV   rn  r{  r   r   r   <module>r     sr   &  V!   G TB TBn	+6 eAqk*E +ES""/: 









 $~&G 
Fqc*	
RRr   