
    fiS                     r    d Z ddlmZ ddlZddlZddlmZ ddlm	Z	  G d d          Z
 G d d	          ZdS )
z>Unit tests for the :mod:`networkx.algorithms.boundary` module.    )combinationsN)convert_node_labels_to_integers)edges_equalc                   <    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	S )
TestNodeBoundaryz<Unit tests for the :func:`~networkx.node_boundary` function.c                    t          j                    }t          j        |g           t                      k    sJ t          j        |g g           t                      k    sJ t          j        |g d          t                      k    sJ t          j        |g dg d          t                      k    sJ t          j        |g dg d          t                      k    sJ dS )z4Tests that the null graph has empty node boundaries.                  r   r   r   N)nx
null_graphnode_boundarysetselfnulls     /var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/networkx/algorithms/tests/test_boundary.pytest_null_graphz TestNodeBoundary.test_null_graph   s    }b))SUU2222b"--6666iii00CEE9999iii;;suuDDDDiii;;suuDDDDDD    c                 6   t          t          j        d          d          }t          j        |g           t	                      k    sJ t          j        |g g           t	                      k    sJ t          j        |g d          dhk    sJ t          j        |g d          ddhk    sJ t          j        |g d	          d
dhk    sJ t          j        |g d          dhk    sJ t          j        |g dddg          t	                      k    sJ d S )N
   r
   first_labelr	   r   r   r      r   r   r   r   r    r      r"   	   r   r$   )cnltir   
path_graphr   r   r   P10s     r   test_path_graphz TestNodeBoundary.test_path_graph   s*   BM"%%1555R((CEE1111R,,5555YYY//A36666YYY//Aq69999___55!Q????ZZZ00QC7777YYYB88CEEAAAAAAr   c                    t          t          j        d          d          }t          j        |g           t	                      k    sJ t          j        |g g           t	                      k    sJ t          j        |g d          h dk    sJ t          j        |g d          h dk    sJ t          j        |g d          h d	k    sJ t          j        |g dg           t	                      k    sJ t          j        ||          t	                      k    sJ t          j        |g dg d
          ddhk    sJ d S )Nr   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   complete_graphr   r   )r   K10s     r   test_complete_graphz$TestNodeBoundary.test_complete_graph"   s\   B%b))q999R((CEE1111R,,5555YYY//3I3I3IIIIIYYY//3I3I3IIIII___559I9I9IIIIIYYY33suu<<<<S))SUU2222YYY			::q!fDDDDDDr   c                    d }t          j                    } ||d          t          j        dd          k    sJ  ||d          t          j        dd          k    sJ  ||d          t          j        d	d          k    sJ  ||d
          t          j        dd          k    sJ  ||d          t          j        dd          k    sJ dS )zqCheck boundaries in the petersen graph

        cheeger(G,k)=min(|bdy(S)|/|S| for |S|=k, 0<k<=|V(G)|/2)

        c                 Z     t           fdt                     D                       S )Nc              3   b   K   | ])}t          t          j        |                    z  V  *d S )N)lenr   r   ).0nnGks     r   	<genexpr>zBTestNodeBoundary.test_petersen.<locals>.cheeger.<locals>.<genexpr>5   s=      UUBs2+Ar2233a7UUUUUUr   )minr   )r4   r5   s   ``r   cheegerz/TestNodeBoundary.test_petersen.<locals>.cheeger4   s5    UUUUU,qRSBTBTUUUUUUr   r
   g      @g{Gz?)absr   g       @r   gQ?r   g      ?r   g?N)r   petersen_graphpytestapprox)r   r8   Ps      r   test_petersenzTestNodeBoundary.test_petersen-   s    	V 	V 	V wq!}}d = = =====wq!}}d = = =====wq!}}d = = =====wq!}}d = = =====wq!}}d = = =======r   c                 z    t          j        g d          }ddh}t          j        ||          }dh}||k    sJ dS )z,Tests the node boundary of a directed graph.)r   r
   r
   r   r   r   r   r   )r   r   r   r
   r   N)r   DiGraphr   r   r4   Sboundaryexpecteds        r   test_directedzTestNodeBoundary.test_directed>   sQ    J???@@F#Aq))38######r   c                     t          j        t          t          j        d                                                    dz            }ddh}t          j        ||          }ddh}||k    sJ dS )z(Tests the node boundary of a multigraph.r   r   r   r
   r   N)r   
MultiGraphlistcycle_graphedgesr   rE   s        r   test_multigraphz TestNodeBoundary.test_multigraphF   so    M$r~a00668899A=>>F#Aq))q68######r   c                     g d}t          j        |dz            }ddh}t          j        ||          }dh}||k    sJ dS )*Tests the edge boundary of a multidigraph.r@   r   r   r
   N)r   MultiDiGraphr   r   rN   r4   rF   rG   rH   s         r   test_multidigraphz"TestNodeBoundary.test_multidigraphN   sY    888OEAI&&F#Aq))38######r   N)__name__
__module____qualname____doc__r   r)   r-   r>   rI   rO   rT    r   r   r   r      s        FFE E EB B B	E 	E 	E> > >"$ $ $$ $ $$ $ $ $ $r   r   c                   6    e Zd ZdZd Zd Zd Zd Zd Zd Z	dS )	TestEdgeBoundaryz<Unit tests for the :func:`~networkx.edge_boundary` function.c                    t          j                    }t          t          j        |g                     g k    sJ t          t          j        |g g                     g k    sJ t          t          j        |g d                    g k    sJ t          t          j        |g dg d                    g k    sJ t          t          j        |g dg d                    g k    sJ d S )Nr	   r   r   )r   r   rL   edge_boundaryr   s     r   r   z TestEdgeBoundary.test_null_graph[   s    }B$T2..//25555B$T2r2233r9999B$T9995566"<<<<B$T999iii@@AARGGGGB$T999iii@@AARGGGGGGr   c                    t          t          j        d          d          }t          t          j        |g                     g k    sJ t          t          j        |g g                     g k    sJ t          t          j        |g d                    dgk    sJ t          t          j        |g d                    ddgk    sJ t          t          j        |g d	                    d
dgk    sJ t          t          j        |g d                    dgk    sJ t          t          j        |g dddg                    g k    sJ t          t          j        |g dg d                    ddgk    sJ d S )Nr   r
   r   r	   rC   r   )r   r   )r   r    r!   )r   r   )r    r"   r#   )r"   r    r$   r   rB   )r%   r   r&   rL   r]   sortedr'   s     r   r)   z TestEdgeBoundary.test_path_graphc   s   BM"%%1555B$S"--.."4444B$S"b1122b8888B$S)))4455&AAAAb&sIII6677FF;KKKKKb&sOOO<<==&&AQQQQQB$S***55666(BBBBb&sIII2w??@@BFFFFB$S)))YYY??@@VVDTTTTTTTr   c                    t          t          j        d          d          }d }t          t          j        |g                     g k    sJ t          t          j        |g g                     g k    sJ  |t          j        |g d                    dk    sJ  |t          j        |g d                    dk    sJ  |t          j        |g d	                    d
k    sJ  |t          j        |g d                    dk    sJ t          t          j        |g dddg          g d          sJ t          t          j        |g dg d          g d          sJ d S )Nr   r
   r   c                 4    t          d | D                       S )Nc              3      K   | ]}d V  dS )r
   NrY   )r2   is     r   r6   zETestEdgeBoundary.test_complete_graph.<locals>.ilen.<locals>.<genexpr>r   s"      ++Qq++++++r   )sum)iterables    r   ilenz2TestEdgeBoundary.test_complete_graph.<locals>.ilenq   s    ++(++++++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   rB   )r   r   )r   r   rC   )r   r   )r%   r   r+   rL   r]   r   )r   r,   rf   s      r   r-   z$TestEdgeBoundary.test_complete_graphn   s   B%b))q999	, 	, 	, B$S"--.."4444B$S"b1122b8888tB$S)))4455;;;;tB$S,,,7788B>>>>tB$S///::;;rAAAAtB$S***5566"<<<<S)))aW55???
 
 	
 	
 	
 S)))YYY77LLL
 
 	
 	
 	
 	
 	
r   c                     t          j        g d          }ddh}t          t          j        ||                    }dg}||k    sJ dS )z,Tests the edge boundary of a directed graph.r@   r   r
   rA   N)r   rD   rL   r]   rE   s        r   rI   zTestEdgeBoundary.test_directed   sY    J???@@F(A..//88######r   c                     t          j        t          t          j        d                                                    dz            }ddh}t          t          j        ||                    }g d}||k    sJ dS )z(Tests the edge boundary of a multigraph.r   r   r   r
   )r   r   rl   rA   rA   N)r   rK   rL   rM   rN   r]   rE   s        r   rO   z TestEdgeBoundary.test_multigraph   sy    M$r~a00668899A=>>F(A..//3338######r   c                     g d}t          j        |dz            }ddh}t          t          j        ||                    }ddg}||k    sJ dS )rQ   r@   r   r   r
   rA   N)r   rR   rL   r]   rS   s         r   rT   z"TestEdgeBoundary.test_multidigraph   sd    888OEAI&&F(A..//F#8######r   N)
rU   rV   rW   rX   r   r)   r-   rI   rO   rT   rY   r   r   r[   r[   X   sz        FFH H H	U 	U 	U
 
 
*$ $ $$ $ $$ $ $ $ $r   r[   )rX   	itertoolsr   r;   networkxr   r   r%   networkx.utilsr   r   r[   rY   r   r   <module>rq      s    D D " " " " " "      = = = = = = & & & & & &I$ I$ I$ I$ I$ I$ I$ I$XB$ B$ B$ B$ B$ B$ B$ B$ B$ B$r   