
    wgS                     d    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y)
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
y	)
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 y)z4Tests that the null graph has empty node boundaries.                  r   r   r   N)nx
null_graphnode_boundarysetselfnulls     l/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/networkx/algorithms/tests/test_boundary.pytest_null_graphz TestNodeBoundary.test_null_graph   s    }}b)SU222b"-666i0CE999i;suDDDi;suDDD    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      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 y )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    BMM"%15R(CE111R,555Y/A3666Y/Aq6999_5!Q???Z0QC777YB8CEAAAr   c                 b   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 y )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R(CE111R,555Y/3IIIIY/3IIII_59IIIIY3su<<<S)SU222Y	:q!f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 y)zqCheck boundaries in the petersen graph

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

        c                 D     t         fdt               D              S )Nc              3   b   K   | ]&  }t        t        j                  |            z   ( y w)N)lenr   r   ).0nnGks     r   	<genexpr>zBTestNodeBoundary.test_petersen.<locals>.cheeger.<locals>.<genexpr>5   s(     UBs2++Ar23a7Us   ,/)minr   )r4   r5   s   ``r   cheegerz/TestNodeBoundary.test_petersen.<locals>.cheeger4   s    U,qRSBT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 q!}d ====q!}d ====q!}d ====q!}d ====q!}d ====r   c                 z    t        j                  g d      }ddh}t        j                  ||      }dh}||k(  sJ y)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>   sA    JJ?@F##Aq)38###r   c                     t        j                  t        t        j                  d      j	                               dz        }ddh}t        j
                  ||      }ddh}||k(  sJ y)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   s^    MM$r~~a06689A=>F##Aq)q68###r   c                     g d}t        j                  |dz        }ddh}t        j                  ||      }dh}||k(  sJ y)*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   sI    8OOEAI&F##Aq)38###r   N)__name__
__module____qualname____doc__r   r)   r-   r>   rI   rO   rT    r   r   r   r      s+    FEB	E>"$$$r   r   c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	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 y )Nr	   r   r   )r   r   rL   edge_boundaryr   s     r   r   z TestEdgeBoundary.test_null_graph[   s    }}B$$T2./2555B$$T2r23r999B$$T956"<<<B$$T9i@ARGGGB$$T9i@AR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 y )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   s4   BMM"%15B$$S"-."444B$$S"b12b888B$$S)45&AAAb&&sI67FF;KKKKb&&sO<=&&AQQQQB$$S*566(BBBb&&sI2w?@BFFFB$$S)Y?@VVDT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 y )Nr   r
   r   c                 &    t        d | D              S )Nc              3       K   | ]  }d   yw)r
   NrY   )r2   is     r   r6   zETestEdgeBoundary.test_complete_graph.<locals>.ilen.<locals>.<genexpr>r   s     +Qq+s   )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   s6   B%%b)q9	, B$$S"-."444B$$S"b12b888B$$S)45;;;B$$S,78B>>>B$$S/:;rAAAB$$S*56"<<<S)aW5?
 	
 
 S)Y7L
 	
 
r   c                     t        j                  g d      }ddh}t        t        j                  ||            }dg}||k(  sJ y)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   sF    JJ?@F((A./88###r   c                     t        j                  t        t        j                  d      j	                               dz        }ddh}t        t        j
                  ||            }g d}||k(  sJ y)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   s_    MM$r~~a06689A=>F((A./38###r   c                     g d}t        j                  |dz        }ddh}t        t        j                  ||            }ddg}||k(  sJ y)rQ   r@   r   r   r
   rA   N)r   rR   rL   r]   rS   s         r   rT   z"TestEdgeBoundary.test_multidigraph   sQ    8OOEAI&F((A./F#8###r   N)
rU   rV   rW   rX   r   r)   r-   rI   rO   rT   rY   r   r   r[   r[   X   s%    FH	U
*$$$r   r[   )rX   	itertoolsr   r;   networkxr   r   r%   networkx.utilsr   r   r[   rY   r   r   <module>rq      s0    D "   = &I$ I$XB$ B$r   