
    fiC                     j    d dl Z d dlZd dlmZmZmZ  G d d          Zd Zd Z	 G d d          Z
dS )	    N)check_planarity_recursiveget_counterexampleget_counterexample_recursivec                   Z   e Zd ZdZed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ej                            dej         ej!        f          d             Z"ej                            dg d          d             Z#dS ) TestLRPlanaritya`  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                 6   t          j        | d          \  }}t          | d          \  }}|'|rd}nd}||k    s
J |            ||k    s
J |            |r"t          | |           t          | |           dS t	          | |           t	          | |           dS )a,  Raises 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          /var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/networkx/algorithms/tests/test_planarity.pycheck_graphzTestLRPlanarity.check_graph   s      "1!T::f'@D'I'I$*  LGK ,,,c,,, 0000#000 	0Av&&&Az***** !F+++ J/////    c                 `    g d}|                      t          j        |          d           d S )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_graphz(TestLRPlanarity.test_simple_planar_graph:   s<    
 
 
 	!55555r   c                 `    g d}|                      t          j        |          d           d S )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_selfloopz)TestLRPlanarity.test_planar_with_selfloopJ   s<    
 
 
 	!55555r   c                 Z    |                      t          j        dd          d           d S )Nr   Fr(   )r   r	   complete_bipartite_graphr,   s    r   	test_k3_3zTestLRPlanarity.test_k3_3\   s.    4Q::eLLLLLr   c                 X    |                      t          j        d          d           d S Nr$   Fr(   )r   r	   complete_graphr6   s    r   test_k5zTestLRPlanarity.test_k5_   s,    *1--?????r   c                 `    g d}|                      t          j        |          d           d S )N)r   r   r   r   r&   r$   r    )r    r   Tr(   r)   r+   s     r   test_multiple_components_planarz/TestLRPlanarity.test_multiple_components_planarb   s4    <<<!55555r   c                     t          j        d          }|                    g d           |                     |d           d S )Nr$   )r!   r"      )rB   r    Fr(   )r	   r:   add_edges_fromr   r,   r   s     r   #test_multiple_components_non_planarz3TestLRPlanarity.test_multiple_components_non_planarf   sN    a   	
111222e,,,,,r   c                     t          j        d          }t          d          D ]}|                    ||           |                     |d           d S r9   )r	   r:   rangeadd_edger   )r,   r   is      r   test_non_planar_with_selfloopz-TestLRPlanarity.test_non_planar_with_selfloopm   s]    a  q 	 	AJJq!e,,,,,r   c                 `    g d}|                      t          j        |          d           d S )N)
r#   )r   r    r   r"   r   r    r   r2   )r   r"   r&   r   r   r"   Fr(   r)   r+   s     r   test_non_planar1z TestLRPlanarity.test_non_planar1t   s<    
 
 
 	!66666r   c                 d    ddg}t          j        |          }|                     |d           d S )Nr   r0   Tr(   r	   r*   r   r,   r-   r   s      r   	test_loopzTestLRPlanarity.test_loop   s8    VHQKKd+++++r   c                     ddg}t          j        |          }|                    dd           |                     |d           d S )Nr   r   r   r   Tr(   )r	   r*   remove_edger   rR   s      r   	test_compzTestLRPlanarity.test_comp   sL    VHQKK	ad+++++r   c                 d    g d}t          j        |          }|                     |d           d S )N)r   r1   r   r   r#   rL   )r   rB   )r   
   r      r   r%   rM   )r   r"   )r   	   )r   rY   )r   r[   r   r&   r   rN   r'   r!   rA   )r"   r\   r"   rY   )rB   rY   )r\   rY   )rY   r[   Tr(   rQ   rR   s      r   test_goldner_hararyz#TestLRPlanarity.test_goldner_harary   sA    
 
 
: HQKKd+++++r   c                 `    t          j        g d          }|                     |d           d S )N)r   r   r   r   r   r=   Tr(   )r	   
MultiGraphr   rD   s     r   test_planar_multigraphz&TestLRPlanarity.test_planar_multigraph   s7    MJJJKKd+++++r   c                     t          j        t          j        d                    }|                    dgdz             |                     |d           d S )Nr$   r   Fr(   )r	   r`   r:   rC   r   rD   s     r   test_non_planar_multigraphz*TestLRPlanarity.test_non_planar_multigraph   sU    M"+A..//	&A&&&e,,,,,r   c                 `    t          j        g d          }|                     |d           d S )N)r   r   r%   )r   r   )r   r   rX   )r   r   Tr(   )r	   DiGraphr   rD   s     r   test_planar_digraphz#TestLRPlanarity.test_planar_digraph   s7    JOOOPPd+++++r   c                     t          j        t          j        d                    }|                    dd           |                    dd           |                     |d           d S )Nr$   r   r   r   Fr(   )r	   re   r:   rU   r   rD   s     r   test_non_planar_digraphz'TestLRPlanarity.test_non_planar_digraph   sc    Jr(++,,	a	ae,,,,,r   c                     t          j                    }|                    d           |                     |d           d S )Nr   Tr(   )r	   r*   add_noder   rD   s     r   test_single_componentz%TestLRPlanarity.test_single_component   s;    HJJ	

1d+++++r   c                 `    t          j        g d          }|                     |d           d S )N)
)r   rY   r      r   rn   )r"   r[   r   rB   )rB   rn   r   r   r   r"   )r   rY   rL   Tr(   rQ   rD   s     r   test_graph1zTestLRPlanarity.test_graph1   sC    H  
 
 	d+++++r   c                 `    t          j        g d          }|                     |d           d S )N)r   )r   rn   )r   rn   r&   r]   rL   r   r   rM   r>   )r"   rn   )r   rB   rp   )r   r\   rm   r!   )r   r    )r   rB   Fr(   rQ   rD   s     r   test_graph2zTestLRPlanarity.test_graph2   sC    H  
 
* 	e,,,,,r   c                 `    t          j        g d          }|                     |d           d S )N)rr   )r   r[   r   )rB   r\   )r   r[   rL   ro   rZ   r2   r'   r1   )r   r   )r$   r[   )r$   rn   Fr(   rQ   rD   s     r   test_graph3zTestLRPlanarity.test_graph3   sC    H  
 
$ 	e,,,,,r   c                     t          j        t          j                  5  t          j                    }|                    d           t          |           d d d            d S # 1 swxY w Y   d S Nr   )pytestraisesr	   NetworkXExceptionr*   rj   r   rD   s     r   test_counterexample_planarz*TestLRPlanarity.test_counterexample_planar
  s    ]2/00 	" 	"

AJJqMMMq!!!		" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"   8A$$A(+A(c                     t          j        t          j                  5  t          j                    }|                    d           t          |           d d d            d S # 1 swxY w Y   d S rz   )r{   r|   r	   r}   r*   rj   r   rD   s     r   $test_counterexample_planar_recursivez4TestLRPlanarity.test_counterexample_planar_recursive  s    ]2/00 	, 	,

AJJqMMM(+++		, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,r   c                    d}t          j        |          }t          j        |          \  }}|du sJ |                    dd           |                     |d           |                    ddd           |                    ddd           |                     |d           |                    d           |                     |d           d S )	N)r   r   r   r   r   )r   r   rq   ru   Tr   r   r(   r   r   )ru   r1   )r	   r*   r
   rU   r   add_half_edge_ccwadd_half_edge_cwremove_edges_from)r,   edgesr   certPs        r   'test_edge_removal_from_planar_embeddingz7TestLRPlanarity.test_edge_removal_from_planar_embedding  s    HHUOO$Q''at||||	ad+++	Aq!$$$	1a###d+++	,---d+++++r   
graph_typec                     |g d          }t          j        |          \  }}|sJ |                                }t          |t           j                  sJ t          d |                    d          D                       sJ d S )N)r   r   r   r   r   r   rq   c              3   *   K   | ]\  }}}|i k    V  d S N ).0_ds      r   	<genexpr>zLTestLRPlanarity.test_graph_planar_embedding_to_undirected.<locals>.<genexpr>-  s,      >>1aAG>>>>>>r   Tdata)r	   r
   to_undirected
isinstancer*   allr   )r,   r   r   r   r   Us         r   )test_graph_planar_embedding_to_undirectedz9TestLRPlanarity.test_graph_planar_embedding_to_undirected&  s    JGGGHH)!,,	1OO!RX&&&&&>>1777+=+=>>>???????r   zreciprocal, as_view))TT)TF)FTc                     t          j        g d          }t          j        |          \  }}|sJ t          j        t
          d          5  |                    ||           d d d            d S # 1 swxY w Y   d S )N)r   r   r   r   rq   z%is not supported for PlanarEmbedding.match)
reciprocalas_view)r	   r*   r
   r{   r|   
ValueErrorr   )r,   r   r   r   r   r   s         r   6test_planar_embedding_to_undirected_invalid_parameterszFTestLRPlanarity.test_planar_embedding_to_undirected_invalid_parameters/  s     H===>>)!,,	1]:-TUUU 	D 	DOOz7OCCC	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	Ds   A22A69A6r   )$__name__
__module____qualname____doc__staticmethodr   r.   r3   r7   r;   r?   rE   rJ   rO   rS   rV   r^   ra   rc   rf   rh   rk   rs   rv   rx   r~   r   r   r{   markparametrizer	   r*   r`   r   r   r   r   r   r   r      s         "0 "0 "0 \"0H6 6 6 6 6 6$M M M@ @ @6 6 6- - -- - -7 7 7 , , ,, , , ,  ,  ,D, , ,- - -
, , ,- - -, , ,, , ,"- - -0- - -*" " ", , ,, , , [\BHbm+DEE@ @ FE@ [KKK D D D D Dr   r   c                    t          |t          j                  st          j        d          |                                 t          | j                  t          |j                  k    s
J d            t                      }| j        D ]Z}|d         |d         k    rF|                    |d         |d         f           |                    |d         |d         f           [|t          |j                  k    s
J d            dS )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)	r   r	   PlanarEmbeddingr}   check_structuresetnodesr   add)r   	embeddingg_edgesedges       r   r   r   <  s
   & i!344 T"#RSSS  qw<<3y/////> 0//
 eeG , ,7d1gKKa$q'*+++KKa$q'*+++c)/*****> +****r   c                    t          j        |          }|D ].}|                    ||          r|                    ||           /t	          |          }t          |          dk    r|                                }||vr,|j        |         }|dk    rt          ||                   }t          |          }t          |          }|
                    |           |
                    |           |                    |           |                    ||           t          |          dk    t          |          dk    r=t          j        t          j        d          |          st          j        d          dS t          |          dk    r>t          j        t          j        dd          |          st          j        d          dS t          j        d          )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_edgerU   listlenpopdegreeiternextappendremove_noderH   is_isomorphicr:   r}   r5   )r   	sub_graphucontractcontract_noder   	neighborsvs           r   r   r   f  s    ##I  ( (a## 	(!!!Q''' IH h--!

 	))!-0Q;;Y}566IYAYAOOAOOA!!-000q!$$$# h--!

( 9~~ 1! 4 4i@@ 	?&'=>>>	? 	?	Y1		 ;Aq A A9MM 	?&'=>>>	? 	? "#9:::r   c                   l    e 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ed             ZdS )TestPlanarEmbeddingClassc                    t          j                    }|                    dd           t          j        t           j        d          5  |                    ddd           d d d            n# 1 swxY w Y   t          j        t           j        d          5  |                    ddd	           d d d            n# 1 swxY w Y   t          j        t           j        d
          5  |                    dddd           d d d            n# 1 swxY w Y   t          j        t           j        d          5  |                    dd           d d d            n# 1 swxY w Y   |                    ddd           |                    ddd	           t          |                    d                    dddddfdddddfdddddfgk    sJ d S )Nr   r   z!Invalid clockwise reference node.r   r   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.Tr   )r   r   )r	   r   add_half_edger{   r|   r}   sortedr   r,   r   s     r   test_add_half_edgez+TestPlanarEmbeddingClass.test_add_half_edge  s   &((	1%%%] (K
 
 
 	0 	0 ##AqQ#///	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 ] (R
 
 
 	1 	1 ##Aqa#000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 ] (N
 
 
 	7 	7 ##AqQA#666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 ] 6
 
 
 	* 	* ##Aq)))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	1+++1!,,,ioo4o00111A&&'!A&&'!A&&'6
 
 
 
 
 
 
sH   
A//A36A3B??CC*DDD;EE"%E"c                     |                      d          }|                                }g ddgdgdgd}||k    sJ d S )Nr   )r   r   r   r   )r   r   r   r   )get_star_embeddingget_data)r,   r   r   data_cmps       r   test_get_dataz&TestPlanarEmbeddingClass.test_get_data  sX    ++A..	!!## yyaSaSaS99xr   c           
         t          j                    }|                    g dg dddgg dg dddgg dd	           |                    d
           |                                 t          j                    }|                    ddgg dddgg dddgddgg dd	           t           j                            ||          sJ d S )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_removalz*TestPlanarEmbeddingClass.test_edge_removal  s   &((	99<<q6<<<<q699 
	
 
	
 
	
 	##$4555!!###/11##q6<<q699q6q699 
	
 
	
 
	
 x$$Y0BCCCCCCCr   c                     t          j        di idi id          }t          j        t           j                  5  |                                 d d d            d S # 1 swxY w Y   d S )Nr   r   r   r	   r   r{   r|   r}   r   r   s     r   test_missing_edge_orientationz6TestPlanarEmbeddingClass.test_missing_edge_orientation  s    &Ar72w'?'?@@	]2/00 	( 	(%%'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(s   AA #A c                     t          j        ddddiddddidi idi id          }t          j        t           j                  5  |                                 d d d            d S # 1 swxY w Y   d S )Nr   r   r   r   )r   r   r   r   r   r   s     r   test_invalid_edge_orientationz6TestPlanarEmbeddingClass.test_invalid_edge_orientation  s    &a**+a**+r7r7	 
 
	 ]2/00 	( 	(%%'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(s   A((A,/A,c                     t          j                    }|                    dd           t          j        t           j                  5  |                                 d d d            d S # 1 swxY w Y   d S Nr   r   )r	   r   r   r{   r|   r}   r   r   s     r   test_missing_half_edgez/TestPlanarEmbeddingClass.test_missing_half_edge  s    &((	1%%%]2/00 	( 	(%%'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(s   A**A.1A.c                 N   t          j                    }t          d          D ]6}d }t          d          D ]"}||k    r|                    |||           |}#7t	          j        t           j                  5  |                                 d d d            d S # 1 swxY w Y   d S )Nr$   r   )r	   r   rG   r   r{   r|   r}   r   )r,   r   rI   refjs        r   !test_not_fulfilling_euler_formulaz:TestPlanarEmbeddingClass.test_not_fulfilling_euler_formula  s    &((	q 	 	AC1XX  66++AqS+999C ]2/00 	( 	(%%'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(s   8BB!Bc                     t          j                    }t          j        t           j        d          5  |                    ddd           d d d            d S # 1 swxY w Y   d S )NzInvalid reference node.r   r   r   r   r   )r	   r   r{   r|   r}   r   r   s     r   test_missing_referencez/TestPlanarEmbeddingClass.test_missing_reference  s    &((	]2/7PQQQ 	1 	1##Aqa#000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1s   AA!Ac                 X    t          j                    }|                    dd           d S r   )r	   r   connect_componentsr   s     r   test_connect_componentsz0TestPlanarEmbeddingClass.test_connect_components  s,    &((	$$Q*****r   c                     t          j                    }|                    dd           |                    dd           |                    dd          }|ddgk    sJ d S r   )r	   r   r   traverse_face)r,   r   faces      r   test_successful_face_traversalz7TestPlanarEmbeddingClass.test_successful_face_traversal  sf    &((	1%%%1%%%&&q!,,1v~~~~~~r   c                     t          j        ddddiddddid          }t          j        t           j                  5  |                    dd           d d d            d S # 1 swxY w Y   d S )Nr   r   r   r   r   )r	   r   r{   r|   r}   r   r   s     r    test_unsuccessful_face_traversalz9TestPlanarEmbeddingClass.test_unsuccessful_face_traversal  s    &1Q''(a!1D1D-EFF
 
	 ]2/00 	* 	*##Aq)))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s    A$$A(+A(c                 2   t          j                    }|                    d           |                    dg           t	          j        t                    5  |                    dd           d d d            n# 1 swxY w Y   t	          j        t                    5  |                    ddg           d d d            n# 1 swxY w Y   t	          j        t                    5  |	                    ddg           d d d            d S # 1 swxY w Y   d S )	N*   )      r   r   rq   rX   )r   r   i^  )r   r   }   )
r	   r   rj   add_nodes_fromr{   r|   NotImplementedErrorrH   rC   add_weighted_edges_fromr   s     r   test_forbidden_methodsz/TestPlanarEmbeddingClass.test_forbidden_methods  s   &((	2  (,,,].// 	% 	%q!$$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%].// 	7 	7$$ff%5666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7].// 	J 	J--{K.HIII	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	Js6   A;;A?A?CC
C'DDDc                     t          j                    }d }t          d|           D ]2}|                    d||           |}|                    |d           3|S )Nr   r   r   )r	   r   rG   r   )nr   r   rI   s       r   r   z+TestPlanarEmbeddingClass.get_star_embedding$  sk    &((	q! 	* 	*A##AqS#111C##Aq))))r   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s        
 
 
@     D D D<( ( (
( 
( 
(( ( (	( 	( 	(1 1 1
+ + +  * * *	J 	J 	J   \  r   r   )r{   networkxr	   networkx.algorithms.planarityr   r   r   r   r   r   r   r   r   r   <module>r      s                 nD nD nD nD nD nD nD nDb	' ' 'T0; 0; 0;fS S S S S S S S S Sr   