o
    ßË·eq3  ã                   @   sT   d dl Z d dlZd dlmZmZmZ G dd„ dƒZdd„ Zdd„ Z	G d	d
„ d
ƒZ
dS )é    N)Úcheck_planarity_recursiveÚget_counterexampleÚget_counterexample_recursivec                   @   sÆ   e Zd ZdZed/dd„ƒZdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ ZdS )0Ú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                 C   sˆ   t  | d¡\}}t| dƒ\}}|dur*|rd}nd}||ks"J |ƒ‚||ks*J |ƒ‚|r8t| |ƒ 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Úmsg© r   ú_/var/www/ideatree/venv/lib/python3.10/site-packages/networkx/algorithms/tests/test_planarity.pyÚcheck_graph   s   

zTestLRPlanarity.check_graphc                 C   ó    g d¢}| j t |¡d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Úer   r   r   Útest_simple_planar_graph:   s   z(TestLRPlanarity.test_simple_planar_graphc                 C   r   )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(   r   r   r   Útest_planar_with_selfloopJ   s   z)TestLRPlanarity.test_planar_with_selfloopc                 C   s   | j t dd¡dd d S )Nr   Fr%   )r   r   Úcomplete_bipartite_graph©r)   r   r   r   Ú	test_k3_3\   s   zTestLRPlanarity.test_k3_3c                 C   s   | j t d¡dd d S ©Nr!   Fr%   )r   r   Úcomplete_graphr1   r   r   r   Útest_k5_   s   zTestLRPlanarity.test_k5c                 C   r   )N)r   r   ©r   r   r#   ©r!   r   )r   r   Tr%   r&   r(   r   r   r   Útest_multiple_components_planarb   s   z/TestLRPlanarity.test_multiple_components_planarc                 C   s*   t  d¡}| g d¢¡ | j|dd d S )Nr!   )r   ©r   é   )r:   r   Fr%   )r   r4   Úadd_edges_fromr   ©r)   r
   r   r   r   Ú#test_multiple_components_non_planarf   s   
z3TestLRPlanarity.test_multiple_components_non_planarc                 C   s6   t  d¡}tdƒD ]}| ||¡ q	| j|dd d S r3   )r   r4   ÚrangeÚadd_edger   )r)   r
   Úir   r   r   Útest_non_planar_with_selfloopm   s   
z-TestLRPlanarity.test_non_planar_with_selfloopc                 C   r   )N)
r    )r   r   ©r   r   ©r   r   r   r.   )r   r   r#   r   ©r   r   Fr%   r&   r(   r   r   r   Útest_non_planar1t   s   z TestLRPlanarity.test_non_planar1c                 C   s$   ddg}t  |¡}| j|dd d S )Nr   r,   Tr%   ©r   r'   r   ©r)   r*   r
   r   r   r   Ú	test_loop„   ó   
zTestLRPlanarity.test_loopc                 C   s0   ddg}t  |¡}| dd¡ | j|dd d S )Nr   r   r   r   Tr%   )r   r'   Úremove_edger   rG   r   r   r   Ú	test_compŠ   s   
zTestLRPlanarity.test_compc                 C   s$   g d¢}t  |¡}| j|dd d S )N)r   r-   ©r   r   r    rB   )r   r:   )r   é
   ©r   é   r   r"   rC   )r   r   )r   é	   )r   rM   )r   rO   r   r#   r   rD   r$   r   r9   )r   rP   ©r   rM   )r:   rM   )rP   rM   )rM   rO   Tr%   rF   rG   r   r   r   Útest_goldner_harary‘   s   
z#TestLRPlanarity.test_goldner_hararyc                 C   ó    t  g d¢¡}| j|dd d S )N)r   r   r   r   r   r6   Tr%   )r   Ú
MultiGraphr   r<   r   r   r   Útest_planar_multigraph³   ó   z&TestLRPlanarity.test_planar_multigraphc                 C   s2   t  t  d¡¡}| dgd ¡ | j|dd d S )Nr!   r   Fr%   )r   rT   r4   r;   r   r<   r   r   r   Útest_non_planar_multigraph·   s   z*TestLRPlanarity.test_non_planar_multigraphc                 C   rS   )N)r   r   r"   )r   r   )r   r   rL   )r   r   Tr%   )r   ÚDiGraphr   r<   r   r   r   Útest_planar_digraph¼   rV   z#TestLRPlanarity.test_planar_digraphc                 C   s:   t  t  d¡¡}| dd¡ | dd¡ | j|dd d S )Nr!   r   r   r   Fr%   )r   rX   r4   rJ   r   r<   r   r   r   Útest_non_planar_digraphÀ   s   z'TestLRPlanarity.test_non_planar_digraphc                 C   s$   t  ¡ }| d¡ | j|dd d S )Nr   Tr%   )r   r'   Úadd_noder   r<   r   r   r   Útest_single_componentÆ   rI   z%TestLRPlanarity.test_single_componentc                 C   rS   )N)
)r   rM   ©r   é   ©r   r^   )r   rO   ©r   r:   )r:   r^   )r   r   ©r   r   )r   rM   rB   Tr%   ©r   ÚOrderedGraphr   r<   r   r   r   Útest_graph1Ì   s   ÿzTestLRPlanarity.test_graph1c                 C   rS   )N)r   )r   r^   )r   r^   r#   rQ   rB   )r   r   rC   r7   )r   r^   )r   r:   r`   )r   rP   r]   r   )r   r   )r   r:   Fr%   rb   r<   r   r   r   Útest_graph2Ý   s   ÿzTestLRPlanarity.test_graph2c                 C   rS   )N)ra   )r   rO   r   )r:   rP   )r   rO   rB   r_   rN   r.   r$   r-   )r   r   )r!   rO   )r!   r^   Fr%   rb   r<   r   r   r   Útest_graph3õ   s   ÿzTestLRPlanarity.test_graph3c                 C   óL   t  tj¡ t ¡ }| d¡ t|ƒ W d   ƒ d S 1 sw   Y  d S ©Nr   )ÚpytestÚraisesr   ÚNetworkXExceptionr'   r[   r   r<   r   r   r   Útest_counterexample_planar
  ó
   

"üz*TestLRPlanarity.test_counterexample_planarc                 C   rg   rh   )ri   rj   r   rk   r'   r[   r   r<   r   r   r   Ú$test_counterexample_planar_recursive  rm   z4TestLRPlanarity.test_counterexample_planar_recursive)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústaticmethodr   r+   r/   r2   r5   r8   r=   rA   rE   rH   rK   rR   rU   rW   rY   rZ   r\   rd   re   rf   rl   rn   r   r   r   r   r      s2    	$"r   c                 C   s¢   t |tjƒst d¡‚| ¡  t| jƒt|jƒksJ dƒ‚tƒ }| jD ] }|d |d krC| |d |d f¡ | |d |d f¡ q#|t|jƒksOJ 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)	Ú
isinstancer   ÚPlanarEmbeddingrk   Úcheck_structureÚsetÚnodesÚedgesÚadd)r
   Ú	embeddingÚg_edgesÚedger   r   r   r     s&   

ÿþ
€ÿþr   c                 C   s  t  |¡}|D ]}| ||¡r| ||¡ qt|ƒ}t|ƒdkr[| ¡ }||vr)q|j| }|dkrUt|| ƒ}t	|ƒ}t	|ƒ}| 
|¡ | 
|¡ | |¡ | ||¡ t|ƒdks t|ƒdkrqt  t  d¡|¡sot  d¡‚dS t|ƒdkrˆt  t  dd¡|¡s†t  d¡‚dS t  d¡‚)zÉRaises 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_edgerJ   ÚlistÚlenÚpopÚdegreeÚiterÚnextÚappendÚremove_noder?   Úis_isomorphicr4   rk   r0   )r
   Ú	sub_graphÚuÚcontractÚcontract_noder‚   Ú	neighborsÚvr   r   r   r	   C  s:   

€



ï
ÿ
ÿ
r	   c                   @   s`   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zedd„ ƒZdS )ÚTestPlanarEmbeddingClassc                 C   s6   |   d¡}| ¡ }ddgdgdgdœ}||ksJ ‚d S )Nr   r   r   r   )r   r   r   )Úget_star_embeddingÚget_data)r)   r{   ÚdataÚdata_cmpr   r   r   Útest_get_dataw  s   
z&TestPlanarEmbeddingClass.test_get_datac                 C   sZ   t  tj¡ t ¡ }| dd¡ | dd¡ | ¡  W d   ƒ d S 1 s&w   Y  d S ©Nr   r   )ri   rj   r   rk   ru   r?   rv   ©r)   r{   r   r   r   Útest_missing_edge_orientation}  s   
"ûz6TestPlanarEmbeddingClass.test_missing_edge_orientationc                 C   sf   t  tj¡# t ¡ }| dd¡ | dd¡ | dd¡ | ¡  W d   ƒ d S 1 s,w   Y  d S ©Nr   r   r   )ri   rj   r   rk   ru   Úadd_half_edge_firstr?   rv   r•   r   r   r   Útest_invalid_edge_orientation…  s   
"ûz6TestPlanarEmbeddingClass.test_invalid_edge_orientationc                 C   sN   t  tj¡ t ¡ }| dd¡ | ¡  W d   ƒ d S 1 s w   Y  d S r”   )ri   rj   r   rk   ru   r˜   rv   r•   r   r   r   Útest_missing_half_edge  s
   
"üz/TestPlanarEmbeddingClass.test_missing_half_edgec                 C   sr   t  tj¡) t ¡ }tdƒD ]}tdƒD ]}||kr!| ||¡ qq| ¡  W d   ƒ d S 1 s2w   Y  d S )Nr!   )ri   rj   r   rk   ru   r>   r˜   rv   )r)   r{   r@   Újr   r   r   Ú!test_not_fulfilling_euler_formula”  s   €þ
"úz:TestPlanarEmbeddingClass.test_not_fulfilling_euler_formulac                 C   sH   t  tj¡ t ¡ }| ddd¡ W d   ƒ d S 1 sw   Y  d S r—   )ri   rj   r   rk   ru   Úadd_half_edge_cwr•   r   r   r   Útest_missing_reference  s   "þz/TestPlanarEmbeddingClass.test_missing_referencec                 C   s   t  ¡ }| dd¡ d S r”   )r   ru   Úconnect_componentsr•   r   r   r   Útest_connect_components¢  s   z0TestPlanarEmbeddingClass.test_connect_componentsc                 C   s@   t  ¡ }| dd¡ | dd¡ | dd¡}|ddgksJ ‚d S r”   )r   ru   r˜   Útraverse_face)r)   r{   Úfacer   r   r   Útest_successful_face_traversal¦  s
   z7TestPlanarEmbeddingClass.test_successful_face_traversalc                 C   sj   t  tj¡% t ¡ }|jddddd |jddddd | dd¡ W d   ƒ d S 1 s.w   Y  d S )Nr   r   r   )ÚccwÚcw)ri   rj   r   rk   ru   r?   r¡   r•   r   r   r   Ú test_unsuccessful_face_traversal­  s   "üz9TestPlanarEmbeddingClass.test_unsuccessful_face_traversalc                 C   s4   t  ¡ }td| ƒD ]}| d|¡ | |d¡ q	|S )Nr   r   )r   ru   r>   r˜   )Únr{   r@   r   r   r   r   ´  s
   z+TestPlanarEmbeddingClass.get_star_embeddingN)ro   rp   rq   r“   r–   r™   rš   rœ   rž   r    r£   r¦   rs   r   r   r   r   r   rŽ   v  s    	rŽ   )ri   Únetworkxr   Únetworkx.algorithms.planarityr   r   r   r   r   r	   rŽ   r   r   r   r   Ú<module>   s      *3