
    h@                     \    S SK r S SKrS SKJrJrJr   " S S5      rS rS r	 " S S5      r
g)	    N)check_planarity_recursiveget_counterexampleget_counterexample_recursivec                       \ rS rSrSr\SS j5       rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rSrg)TestLRPlanarity   aH  Nose Unit tests for the :mod:`networkx.algorithms.planarity` module.

Tests three things:
1. Check that the result is correct
    (returns planar if and only if the graph is actually planar)
2. In case a counter example is returned: Check if it is correct
3. In case an embedding is returned: Check if its actually an embedding
Nc                    [         R                  " U S5      u  p#[        U S5      u  pEUb$  U(       a  SnOSnX:X  d   U5       eX:X  d   U5       eU(       a  [        X5        [        X5        g[	        X5        [	        X5        g)zRaises an exception if the lr_planarity check returns a wrong result

Parameters
----------
G : NetworkX graph
is_planar : bool
    The expected result of the planarity check.
    If set to None only counter example or embedding are verified.

TNz/Wrong planarity check result. Should be planar.z3Wrong planarity check result. Should be non-planar.)nxcheck_planarityr   check_embeddingcheck_counterexample)G	is_planaris_planar_lrresultis_planar_lr_rec
result_recmsgs          Z/var/www/html/env/lib/python3.13/site-packages/networkx/algorithms/tests/test_planarity.pycheck_graphTestLRPlanarity.check_graph   s      "11!T:'@D'I$ GK ,1c1,05#50A&A* !+ /    c                 T    / SQnU R                  [        R                  " U5      SS9  g )N)      r      r      r       r"      )r$   r   r      )r&   r   r   r    r    r&   r&   r$   Tr   r   r
   Graphselfes     r   test_simple_planar_graph(TestLRPlanarity.test_simple_planar_graph:   s&    
 	!5r   c                 T    / SQnU R                  [        R                  " U5      SS9  g )N))r   r   r   r   )r   r   )r    r    )r&   r&   r   r   r   r%   )r   r&   r'   r   r   r&   r(   Tr*   r+   r-   s     r   test_planar_with_selfloop)TestLRPlanarity.test_planar_with_selfloopJ   s&    
 	!5r   c                 N    U R                  [        R                  " SS5      SS9  g )Nr   Fr*   )r   r
   complete_bipartite_graphr.   s    r   	test_k3_3TestLRPlanarity.test_k3_3\   s"    44Q:eLr   c                 L    U R                  [        R                  " S5      SS9  g Nr&   Fr*   )r   r
   complete_graphr:   s    r   test_k5TestLRPlanarity.test_k5_   s     **1-?r   c                 T    / SQnU R                  [        R                  " U5      SS9  g )N)r   r   r   r   r(   r&   r"   )r"   r    Tr*   r+   r-   s     r   test_multiple_components_planar/TestLRPlanarity.test_multiple_components_planarb   s"    <!5r   c                 v    [         R                  " S5      nUR                  / SQ5        U R                  USS9  g )Nr&   )r#   r$      )rI   r"   Fr*   )r
   r?   add_edges_fromr   r.   r   s     r   #test_multiple_components_non_planar3TestLRPlanarity.test_multiple_components_non_planarf   s6    a  	
12e,r   c                     [         R                  " S5      n[        S5       H  nUR                  X"5        M     U R	                  USS9  g r>   )r
   r?   rangeadd_edger   )r.   r   is      r   test_non_planar_with_selfloop-TestLRPlanarity.test_non_planar_with_selfloopm   s?    a qAJJq e,r   c                 T    / SQnU R                  [        R                  " U5      SS9  g )N)
r%   )r   r"   r   r$   r   r"   r   r5   )r   r$   r(   r!   r    r$   Fr*   r+   r-   s     r   test_non_planar1 TestLRPlanarity.test_non_planar1t   s&    
 	!6r   c                 X    SS/n[         R                  " U5      nU R                  USS9  g )Nr   r3   Tr*   r
   r,   r   r.   r/   r   s      r   	test_loopTestLRPlanarity.test_loop   s,    VHHQKd+r   c                 |    SS/n[         R                  " U5      nUR                  SS5        U R                  USS9  g )Nr   r   r   r   Tr*   )r
   r,   remove_edger   r\   s      r   	test_compTestLRPlanarity.test_comp   s:    VHHQK	ad+r   c                 X    / SQn[         R                  " U5      nU R                  USS9  g )N)r   r4   r   r    r%   rU   )r   rI   )r   
   r   r   r   r'   rV   )r   r$   )r   	   )r   re   )r   r   r   r(   r!   rW   r)   r#   rH   )r$   rg   r$   re   )rI   re   )rg   re   )re   r   Tr*   r[   r\   s      r   test_goldner_harary#TestLRPlanarity.test_goldner_harary   s+    
: HHQKd+r   c                 T    [         R                  " / SQ5      nU R                  USS9  g )N)r   r   r   r   r   rC   Tr*   )r
   
MultiGraphr   rK   s     r   test_planar_multigraph&TestLRPlanarity.test_planar_multigraph   s$    MMJKd+r   c                     [         R                  " [         R                  " S5      5      nUR                  S/S-  5        U R	                  USS9  g )Nr&   r   Fr*   )r
   rl   r?   rJ   r   rK   s     r   test_non_planar_multigraph*TestLRPlanarity.test_non_planar_multigraph   sB    MM"++A./	&A&e,r   c                 T    [         R                  " / SQ5      nU R                  USS9  g )N)r   r   r'   )r    r   )r    r   rd   )r   r   Tr*   )r
   DiGraphr   rK   s     r   test_planar_digraph#TestLRPlanarity.test_planar_digraph   s$    JJOPd+r   c                     [         R                  " [         R                  " S5      5      nUR                  SS5        UR                  SS5        U R	                  USS9  g )Nr&   r   r   r    Fr*   )r
   rs   r?   r`   r   rK   s     r   test_non_planar_digraph'TestLRPlanarity.test_non_planar_digraph   sJ    JJr((+,	a	ae,r   c                 p    [         R                  " 5       nUR                  S5        U R                  USS9  g )Nr   Tr*   )r
   r,   add_noder   rK   s     r   test_single_component%TestLRPlanarity.test_single_component   s+    HHJ	

1d+r   c                 T    [         R                  " / SQ5      nU R                  USS9  g )N)
)r   re   r      r   r   )r$   r   r   rI   )rI   r   r   r   r   r$   )r   re   rU   Tr*   r[   rK   s     r   test_graph1TestLRPlanarity.test_graph1   s*    HH
 	d+r   c                 T    [         R                  " / SQ5      nU R                  USS9  g )N)r   )r    r   )r   r   r(   rh   rU   r   r   rV   rD   )r$   r   )r    rI   r   )r   rg   r~   r#   )r   r"   )r   rI   Fr*   r[   rK   s     r   test_graph2TestLRPlanarity.test_graph2   s*    HH
* 	e,r   c                 T    [         R                  " / SQ5      nU R                  USS9  g )N)r   )r   r   r   )rI   rg   )r    r   rU   r   rf   r5   r)   r4   )r   r    )r&   r   )r&   r   Fr*   r[   rK   s     r   test_graph3TestLRPlanarity.test_graph3   s*    HH
$ 	e,r   c                     [         R                  " [        R                  5         [        R                  " 5       nUR                  S5        [        U5        S S S 5        g ! , (       d  f       g = fNr   )pytestraisesr
   NetworkXExceptionr,   rz   r   rK   s     r   test_counterexample_planar*TestLRPlanarity.test_counterexample_planar
  s>    ]]2//0
AJJqMq!	 100   2A  
A.c                     [         R                  " [        R                  5         [        R                  " 5       nUR                  S5        [        U5        S S S 5        g ! , (       d  f       g = fr   )r   r   r
   r   r,   rz   r   rK   s     r   $test_counterexample_planar_recursive4TestLRPlanarity.test_counterexample_planar_recursive  s>    ]]2//0
AJJqM(+	 100r   c                 d   Sn[         R                  " U5      n[         R                  " U5      u  p4USL d   eUR                  SS5        U R	                  USS9  UR                  SSS5        UR                  SSS5        U R	                  USS9  UR                  S5        U R	                  USS9  g )	N))r   r   r   r   r   )r    r   r   r   Tr   r   r*   r   r   )r   r4   )r
   r,   r   r`   r   add_half_edge_ccwadd_half_edge_cwremove_edges_from)r.   edgesr   certPs        r   'test_edge_removal_from_planar_embedding7TestLRPlanarity.test_edge_removal_from_planar_embedding  s    HHHUO$$Q't||	ad+	Aq!$	1a#d+	,-d+r    )N)__name__
__module____qualname____firstlineno____doc__staticmethodr   r0   r6   r;   r@   rE   rL   rR   rX   r]   ra   ri   rm   rp   rt   rw   r{   r   r   r   r   r   r   __static_attributes__r   r   r   r   r      s     "0 "0H6 6$M@6--7 ,, ,D,-
,-,,"-0-*",,r   r   c                    [        U[        R                  5      (       d  [        R                  " S5      eUR	                  5         [        U R                  5      [        UR                  5      :X  d   S5       e[        5       nU R                   HC  nUS   US   :w  d  M  UR                  US   US   45        UR                  US   US   45        ME     U[        UR                  5      :X  d   S5       eg)a  Raises an exception if the combinatorial embedding is not correct

Parameters
----------
G : NetworkX graph
embedding : a dict mapping nodes to a list of edges
    This specifies the ordering of the outgoing edges from a node for
    a combinatorial embedding

Notes
-----
Checks the following things:
    - The type of the embedding is correct
    - The nodes and edges match the original graph
    - Every half edge has its matching opposite half edge
    - No intersections of edges (checked by Euler's formula)
z-Bad embedding. Not of type nx.PlanarEmbeddingz4Bad embedding. Nodes don't match the original graph.r   r   z4Bad embedding. Edges don't match the original graph.N)	
isinstancer
   PlanarEmbeddingr   check_structuresetnodesr   add)r   	embeddingg_edgesedges       r   r   r   '  s    & i!3!344""#RSS  qww<3  >=> 
 eG7d1gKKa$q'*+KKa$q'*+  c  >=> r   c                    [         R                  " U5      nU H,  nUR                  X"5      (       d  M  UR                  X"5        M.     [	        U5      n[        U5      S:  a  UR                  5       nXA;  a  M&  UR                  U   nUS:X  ag  [        X   5      n[        U5      n[        U5      nUR                  U5        UR                  U5        UR                  U5        UR                  X'5        [        U5      S:  a  M  [        U5      S:X  aG  [         R                  " [         R                  " S5      U5      (       d  [         R                  " S5      eg[        U5      S:X  aH  [         R                  " [         R                   " SS5      U5      (       d  [         R                  " S5      eg[         R                  " S5      e)zRaises an exception if the counterexample is wrong.

Parameters
----------
G : NetworkX graph
subdivision_nodes : set
    A set of nodes inducing a subgraph as a counterexample
r   r   r&   zBad counter example.r"   r   N)r
   r,   has_edger`   listlenpopdegreeiternextappendremove_noderP   is_isomorphicr?   r   r9   )r   	sub_graphucontractcontract_noder   	neighborsvs           r   r   r   Q  s~    #I a##!!!' 
 IH h-!
 )!!-0Q;Y56IYAYAOOAOOA!!-0q$# h-!
( 9~ 1 1! 4i@@&&'=>> A	Y1	 ; ;Aq A9MM&&'=>> N ""#9::r   c                   l    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rS r\S 5       rSrg)TestPlanarEmbeddingClassi  c                 r   [         R                  " 5       nUR                  SS5        [        R                  " [         R
                  SS9   UR                  SSSS9  S S S 5        [        R                  " [         R
                  SS9   UR                  SSSS	9  S S S 5        [        R                  " [         R
                  S
S9   UR                  SSSSS9  S S S 5        [        R                  " [         R
                  SS9   UR                  SS5        S S S 5        UR                  SSSS9  UR                  SSSS	9  [        UR                  SS95      SSSSS.4SSSSS.4SSSSS.4/:X  d   eg ! , (       d  f       GN= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f)Nr   r   z!Invalid clockwise reference node.matchr   r   cwz(Invalid counterclockwise reference node.ccwz$Only one of cw/ccw can be specified.r   r   zNNode already has out-half-edge\(s\), either cw or ccw reference node required.T)data)r   r   )r
   r   add_half_edger   r   r   sortedr   r.   r   s     r   test_add_half_edge+TestPlanarEmbeddingClass.test_add_half_edge  s   &&(	1%]]  (K
 ##AqQ#/
 ]]  (R
 ##Aqa#0
 ]]  (N
 ##AqQA#6
 ]]  6
 ##Aq)
 	1+1!,ioo4o011A&'!A&'!A&'6
 
 	
 
/
 

 

 

 
s0   E4FFF(4
F
F
F%(
F6c                 l    U R                  S5      nUR                  5       n/ SQS/S/S/S.nX#:X  d   eg )Nr    )r   r   r   r   )r   r   r   r   )get_star_embeddingget_data)r.   r   r   data_cmps       r   test_get_data&TestPlanarEmbeddingClass.test_get_data  s@    ++A.	!!# aSaSaS9r   c           
         [         R                  " 5       nUR                  / SQ/ SQSS// SQ/ SQSS// SQS	.5        UR                  S
5        UR	                  5         [         R                  " 5       nUR                  SS// SQSS// SQSS/SS// SQS	.5        [         R
                  R                  X5      (       d   eg )N)r   r&   r$   )r   r   r    r&   r   r    )r   r"   r&   r   )r$   r   r   r    r$   )r"   r   r&   )r   r   r   r    r&   r"   r$   ))r&   r    r%   )r   r"   r   )r
   r   set_datar   r   utilsgraphs_equal)r.   r   embedding_expecteds      r   test_edge_removal*TestPlanarEmbeddingClass.test_edge_removal  s    &&(	q6q6
	
 	##$45!!#//1##q6q6q6q6
	
 xx$$YCCCCr   c                     [         R                  " S0 0S0 0S.5      n[        R                  " [         R                  5         UR                  5         S S S 5        g ! , (       d  f       g = f)Nr   r   r   r
   r   r   r   r   r   r   s     r   test_missing_edge_orientation6TestPlanarEmbeddingClass.test_missing_edge_orientation  sI    &&Ar72w'?@	]]2//0%%' 100s   A
A*c                     [         R                  " SSSS.0SSSS.0S0 0S0 0S.5      n[        R                  " [         R                  5         UR                  5         S S S 5        g ! , (       d  f       g = f)Nr   r   r   r   )r   r   r   r   r   r   s     r   test_invalid_edge_orientation6TestPlanarEmbeddingClass.test_invalid_edge_orientation  sk    &&a*+a*+r7r7	
	 ]]2//0%%' 100s   A((
A6c                     [         R                  " 5       nUR                  SS5        [        R                  " [         R
                  5         UR                  5         S S S 5        g ! , (       d  f       g = fNr   r   )r
   r   r   r   r   r   r   r   s     r   test_missing_half_edge/TestPlanarEmbeddingClass.test_missing_half_edge  sJ    &&(	1%]]2//0%%' 100s   A&&
A4c                 H   [         R                  " 5       n[        S5       H0  nS n[        S5       H  nX$:w  d  M
  UR                  X$US9  UnM     M2     [        R
                  " [         R                  5         UR                  5         S S S 5        g ! , (       d  f       g = f)Nr&   r   )r
   r   rO   r   r   r   r   r   )r.   r   rQ   refjs        r   !test_not_fulfilling_euler_formula:TestPlanarEmbeddingClass.test_not_fulfilling_euler_formula  sz    &&(	qAC1X6++AS+9C   ]]2//0%%' 100s   9B
B!c                     [         R                  " 5       n[        R                  " [         R                  SS9   UR                  SSSS9  S S S 5        g ! , (       d  f       g = f)NzInvalid reference node.r   r   r   r   r   )r
   r   r   r   r   r   r   s     r   test_missing_reference/TestPlanarEmbeddingClass.test_missing_reference  sG    &&(	]]2//7PQ##Aqa#0 RQQs   A
A"c                 R    [         R                  " 5       nUR                  SS5        g r   )r
   r   connect_componentsr   s     r   test_connect_components0TestPlanarEmbeddingClass.test_connect_components  s     &&(	$$Q*r   c                     [         R                  " 5       nUR                  SS5        UR                  SS5        UR                  SS5      nUSS/:X  d   eg r   )r
   r   r   traverse_face)r.   r   faces      r   test_successful_face_traversal7TestPlanarEmbeddingClass.test_successful_face_traversal  sR    &&(	1%1%&&q!,1v~~r   c                     [         R                  " SSSS.0SSSS.0S.5      n[        R                  " [         R                  5         UR                  SS5        S S S 5        g ! , (       d  f       g = f)Nr   r   r   r   r   )r
   r   r   r   r   r   r   s     r    test_unsuccessful_face_traversal9TestPlanarEmbeddingClass.test_unsuccessful_face_traversal  s^    &&1Q'(a!1D-EF
	 ]]2//0##Aq) 100s   A$$
A2c                    [         R                  " 5       nUR                  S5        UR                  S/5        [        R
                  " [        5         UR                  SS5        S S S 5        [        R
                  " [        5         UR                  SS/5        S S S 5        [        R
                  " [        5         UR                  SS/5        S S S 5        g ! , (       d  f       N{= f! , (       d  f       NV= f! , (       d  f       g = f)	N*   )      r   r   r   rd   )r   r   i^  )r   r    }   )
r
   r   rz   add_nodes_fromr   r   NotImplementedErrorrP   rJ   add_weighted_edges_fromr   s     r   test_forbidden_methods/TestPlanarEmbeddingClass.test_forbidden_methods  s    &&(	2  (,]]./q!$ 0]]./$$ff%56 0]]./--{K.HI 0/	 0/////s$   CC,>C=
C),
C:=
Dc                     [         R                  " 5       nS n[        SU 5       H'  nUR                  SX2S9  UnUR                  US5        M)     U$ )Nr   r   r   )r
   r   rO   r   )nr   r   rQ   s       r   r   +TestPlanarEmbeddingClass.get_star_embedding  sU    &&(	q!A##Aq#1C##Aq)  r   r   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   r   r   r     sU    
@ D<(
((	(1
+*	J  r   r   )r   networkxr
   networkx.algorithms.planarityr   r   r   r   r   r   r   r   r   r   <module>r     s:      Y, Y,x'>T0;fS Sr   