
    ܛ7iv'                     
   d Z ddlmZ ddlZddlZddlmZ d Zej                  j                  dej                  ej                  f      d        Z G d d	      Z G d
 d      Z G d d      Z G d d      Z G d d      Zy)z=Unit tests for the :mod:`networkx.generators.lattice` module.    )productN)edges_equalc                  |    t        j                  ddd      } t        d | j                  d      D              sJ y )N   F)with_positionsc              3   *   K   | ]  \  }}|d u   y wN ).0_poss      c/home/rose/Desktop/poly/venv/lib/python3.12/site-packages/networkx/generators/tests/test_lattice.py	<genexpr>z0test_hexagonal_lattice_no_pos.<locals>.<genexpr>   s     =)<vq#sd{)<s   r   data)nxhexagonal_lattice_graphallnodes)Gs    r   test_hexagonal_lattice_no_posr      s5    
""1a>A=e)<====    lattice_graphc                      | dddd      }t        d |j                  d      D              sJ t        d |j                  d      D              sJ y)	zhexagonal_lattice_graph and triangular_lattice_graph use nx.contracted_nodes
    under-the-hood when periodic=True. Check that there are no leftover
    "contraction" node attributes on the returned graph.r   FT)r   periodicc              3   ,   K   | ]  \  }}|i k(    y wr	   r
   r   r   r   s      r   r   z;test_2D_lattice_no_contraction_leftovers.<locals>.<genexpr>   s     <);gatrz);s   r   c              3   .   K   | ]  \  }}}|i k(    y wr	   r
   r   s      r   r   z;test_2D_lattice_no_contraction_leftovers.<locals>.<genexpr>   s     ?,>jaDtrz,>s   N)r   r   edges)r   r   s     r   (test_2D_lattice_no_contraction_leftoversr       sR     	a54@A<d);<<<<?AGGG,>????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y)TestGrid2DGraphz@Unit tests for :func:`networkx.generators.lattice.grid_2d_graph`c                 `    d\  }}t        j                  ||      }t        |      ||z  k(  sJ y )N   r   )r   grid_2d_graphlen)selfmnr   s       r   test_number_of_verticesz'TestGrid2DGraph.test_number_of_vertices    s1    1Q"1vQr   c                     d\  }}t        j                  ||      }dddd||z   z  dz
  |dz
  |dz
  z  g}t        j                  |      |k(  sJ y )Nr$   r            )r   r&   degree_histogram)r(   r)   r*   r   expected_histograms        r   test_degree_distributionz(TestGrid2DGraph.test_degree_distribution%   sa    1Q"AqAE{QQ1q58IJ""1%);;;;r   c                     d\  }}t        j                  ||      }t        j                  ||t        j                               }|j                  |j                  k(  sJ |j
                  |j                  k(  sJ y Nr$   create_usingr   r&   DiGraphsuccadjpredr(   r)   r*   r   Hs        r   test_directedzTestGrid2DGraph.test_directed+   s_    1Q"Q

=vvvvr   c                     d\  }}t        j                  ||      }t        j                  ||t        j                               }t        |j	                               t        |j	                               k(  sJ y r4   r   r&   
MultiGraphlistr   r<   s        r   test_multigraphzTestGrid2DGraph.test_multigraph2   sY    1Q"Q@AGGI$qwwy/111r   c           
      $   t        j                  ddd      }t        |j                               i k(  sJ ddt        j                  d      fddt        j                  d      fddt        j                  d      fddt        j
                  d      fddt        j
                  d      fddt        j                         fddt        j                         ffD ]6  \  }}}t        j                  ||d      }t        j                  ||      r6J  y )	Nr   Tr   r.   r-         r%   )r   r&   dictdegreecycle_graphcircular_ladder_graphcubical_graphcould_be_isomorphic)r(   r   r)   r*   r=   s        r   test_periodiczTestGrid2DGraph.test_periodic8   s    QD1AHHJ2%%% 2>>!$%2>>!$%2>>!$%2++A./2++A./2##%&2##%&
GAq!   A5A))!Q///
r   c                     d\  }}t        ddgddg      D ]a  \  }}t        j                  ||||f      }|j                         ||z  k(  sJ |j	                         ||z   dz
  |z  ||z   dz
  |z  z   k(  raJ  y )N)   rG   r   rF   rE   )r   r   r&   number_of_nodesnumber_of_edges)r(   r)   r*   abr   s         r   test_periodic_iterablez&TestGrid2DGraph.test_periodic_iterableH   s    1QFQF+DAq  AA7A$$&!a%///$$&1q519/QUQY!O*KKKK ,r   c                     t        j                  ddd      }t        j                  dddt        j                               }|j                  |j                  k(  sJ |j
                  |j                  k(  sJ y Nr-   r.   TrE   )r   r6   r7   r(   r   r=   s      r   test_periodic_directedz&TestGrid2DGraph.test_periodic_directedO   sZ    QD1QDrzz|Lvvvvr   c                     t        j                  ddd      }t        j                  dddt        j                               }t        |j	                               t        |j	                               k(  sJ y rW   r@   rX   s      r   test_periodic_multigraphz(TestGrid2DGraph.test_periodic_multigraphU   sT    QD1QDr}}OAGGI$qwwy/111r   c                 |   t        j                  t        j                  t        j                  dd       t        j                  t        j                  t        j                  dd       t        j                  t
        t        j                  dd       t        j                  t
        t        j                  dd       y )Nr.   rP   gffffff
@g@)pytestraisesr   NetworkXErrorr&   	TypeError)r(   s    r   test_exceptionszTestGrid2DGraph.test_exceptionsZ   sn    b&&(8(8"a@b&&(8(8!R@i!1!13:i!1!11c:r   c                    t        j                  ddd      }t        j                  t        d      t        d      d      }t        j                  ||      sJ t        j                  ddd      }t        j                  ||      sJ t        j                  dd      }t        j                  t        d      t        d            }t	        ||      sJ y )	Nr-   r.   TrE   abcdefr%   r   )r   r&   rangeis_isomorphicr   rX   s      r   test_node_inputzTestGrid2DGraph.test_node_input`   s    QD1U1XuQx$?1%%%VTD91%%%Q"U1XuQx01a   r   N)__name__
__module____qualname____doc__r+   r2   r>   rC   rN   rU   rY   r[   rc   ri   r
   r   r   r"   r"      s8    J
<20 L2
;!r   r"   c                   "    e Zd ZdZd Zd Zd Zy)TestGridGraphz=Unit tests for :func:`networkx.generators.lattice.grid_graph`c           	         dD ]b  \  }}||g}t        j                  |      }t        |      ||z  k(  sJ t        j                  |      dddd||z   z  dz
  |dz
  |dz
  z  gk(  rbJ  dD ]\  \  }}||g}t        j                  |      }t        |      ||z  k(  sJ t        j                  |t        j
                  d            r\J  y)	zgrid_graph([n,m]) is a connected simple graph with the
        following properties:
        number_of_nodes = n*m
        degree_histogram = [0,0,4,2*(n+m)-8,(n-2)*(m-2)]
        )rP   r%   )r%   rP   r-   r%   )r%   r-   r   r-   r.   r/   ))rF   r%   )r%   rF   r%   N)r   
grid_graphr'   r0   rh   
path_graph)r(   r*   r)   dimgs        r   test_grid_graphzTestGridGraph.test_grid_graphn   s     5DAqa&Cc"Aq6QU?"?&&q)QUaQ1q5!.   	 5 %DAqa&Cc"Aq6QU?"?##Ar}}Q'7888	 %r   c                     t        j                  t        dd      t        dd      g      }t        |      dk(  sJ t        j                  |t        j                  ddg            sJ y )NrG   	   rP   r   r.   )r   rs   rg   r'   rh   )r(   r   s     r   ri   zTestGridGraph.test_node_input   sT    MM5A;a451v2==!Q#8999r   c                 :   d\  }}}t        ddgddgddg      D ]  \  }}}t        j                  |||g|||f      }||z   dz
  |z  |z  ||z   dz
  |z  |z  z   ||z   dz
  |z  |z  z   }|j                         ||z  |z  k(  sJ |j	                         |k(  rJ  y )N)rP   rG   r%   r   rF   rE   )r   r   rs   rQ   rR   )	r(   r)   r*   krS   rT   cr   num_es	            r   rU   z$TestGridGraph.test_periodic_iterable   s    1a1v1v1v6GAq!q!Qi1a)<AUQY!Oa'1q519/A*==QaRS@SSE$$&!a%!)333$$&%///	 7r   N)rj   rk   rl   rm   rw   ri   rU   r
   r   r   ro   ro   k   s    G96:
0r   ro   c                       e Zd ZdZd Zd Zy)TestHypercubeGraphzBUnit tests for :func:`networkx.generators.lattice.hypercube_graph`c                    dt        j                         fdt        j                  d      fdt        j                  d      fdt        j                         ffD ]2  \  }}t        j
                  |      }t        j                  ||      r2J  y )Nr   rF   r.   r-   rP   )r   
null_graphrt   rJ   rL   hypercube_graphrM   )r(   r*   r=   r   s       r   test_special_casesz%TestHypercubeGraph.test_special_cases   s{     a !q!"  "#	
DAq ""1%A))!Q///
r   c                     t        dd      D ]>  }t        j                  |      }dg|z  d|z  gz   }t        j                  |      |k(  r>J  y )NrF   
   r   r.   )rg   r   r   r0   )r(   r*   r   r1   s       r   r2   z+TestHypercubeGraph.test_degree_distribution   sS    q"A""1%A"#qAqD6!1&&q)-???? r   N)rj   rk   rl   rm   r   r2   r
   r   r   r   r      s    L0@r   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestTriangularLatticeGraphzFTests for :func:`networkx.generators.lattice.triangular_lattice_graph`c                    dD ]K  \  }}t        j                  ||      }|dz   dz  }t        |      |dz   d|z   z  |dz  |dz   dz  z  z
  k(  rKJ  j                         D ]f  \  }}|||f   }|k  r|dz   |f|v sJ |k  r||dz   f|v sJ ||k  s3|dkD  s|dz  s>||k  s	|dz   dz  sL|dz   |dz   f|v rY|dz
  |dz   f|v rfJ  y)z4Tests that the graph is really a triangular lattice.)r.   rP   r.   r.   r.   rF   rP   rP   rP   r.   rP   r-   rF   r.   r   N)r   triangular_lattice_graphr'   r   )r(   r)   r*   r   Nijnbrss           r   test_lattice_pointsz.TestTriangularLatticeGraph.test_lattice_points   s   DDAq++Aq1AQ1Aq6a!eA.!a%QUqL1IIIII E GGIDAqaV9D1uAqzT)))1u1q5zT)))1u!a%1q5q1uQ!Aq1u~-!a%Q41GGG r   c                 L   t        j                  ddt        j                               }t        j                  ddt        j                               }|j	                         sJ |j                         D ]+  \  }}|d   |d   k\  sJ |d   |d   k(  s|d   |d   kD  r+J  y)z1Tests for creating a directed triangular lattice.rP   r-   r5   rF   r   N)r   r   Graphr8   is_directedr   )r(   r   r=   uvs        r   r>   z(TestTriangularLatticeGraph.test_directed   s    ''1288:F''12::<H}}GGIDAqQ41Q4<<tqt|tad{"{ r   c                    t        j                  ddt        j                               }t        j                  ddt        j                               }t	        |j                               t	        |j                               k(  sJ y)z3Tests for creating a triangular lattice multigraph.rP   r-   r5   N)r   r   r   rA   rB   r   rX   s      r   rC   z*TestTriangularLatticeGraph.test_multigraph   sX    ''1288:F''12==?KAGGI$qwwy/111r   c                 8   t        j                  ddd      }t        |      dk(  sJ |j                         dk(  sJ t        |j	                         D cg c]  \  }}|dk7  s| c}}      dk(  sJ t        j                  dd	d      }t         j                  }t        j                  t         j                  |d
dd       t        j                  t         j                  |ddd       t        j                  t         j                  |d
dd       y c c}}w )Nr-   r   TrE      $   r   r%   rG   r.   )r   r   r'   sizerI   r_   r`   ra   )r(   r   r*   dTLGs        r   rN   z(TestTriangularLatticeGraph.test_periodic   s    ''1t<1v||vvx2~~!((*7*$!QQA*78A===''1t<))b&&QDAb&&QDAb&&QDA 8   D
$D
Nrj   rk   rl   rm   r   r>   rC   rN   r
   r   r   r   r      s    LH#2
Br   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestHexagonalLatticeGraphzETests for :func:`networkx.generators.lattice.hexagonal_lattice_graph`c                 *   dD ]:  \  }}t        j                  ||      }t        |      d|dz   z  |dz   z  dz
  k(  r:J  t        j                  d      }g dg dg dg dg d	g}|D ])  }t        j                  j                  |      |      r)J  y
)z3Tests that the graph is really a hexagonal lattice.)rr   )r-   r-   )r-   rP   r   r   rq   r.   rF   r   ))r   r   )r   rF   r   r.   )rF   r   rF   rF   rF   r.   )r   )r   rP   )r   r-   r   rF   rP   )rF   r-   )r   r   r   r   r   r   ))r.   r   r   r   )rP   r   )rP   rF   r   )r   r   )r.   r-   r   r   r   N)r   r   r'   rJ   rh   subgraph)r(   r)   r*   r   C_6hexagonshexagons          r   r   z-TestHexagonalLatticeGraph.test_lattice_points   s    DDAq**1a0Aq6Q!a%[AE2Q6666 E nnQ<<<<<
  G##AJJw$7===  r   c                    t        j                  ddt        j                               }t        j                  ddt        j                               }|j	                         sJ t        j
                  |d      }|j                         D ]=  \  }}||   d   ||   d   k\  sJ ||   d   ||   d   k(  s+||   d   ||   d   kD  r=J  y)z0Tests for creating a directed hexagonal lattice.rP   r%   r5   r   rF   r   N)r   r   r   r8   r   get_node_attributesr   )r(   r   r=   r   r   r   s         r   r>   z'TestHexagonalLatticeGraph.test_directed   s    &&q!"((*E&&q!"**,G}}$$Q.GGIDAqq6!9Aq	)))1vayCF1I%1vay3q6!9,,, r   c                    t        j                  ddt        j                               }t        j                  ddt        j                               }t	        |j                               t	        |j                               k(  sJ y)z2Tests for creating a hexagonal lattice multigraph.rP   r%   r5   N)r   r   r   rA   rB   r   rX   s      r   rC   z)TestHexagonalLatticeGraph.test_multigraph   sX    &&q!"((*E&&q!"--/JAGGI$qwwy/111r   c                 8   t        j                  ddd      }t        |      dk(  sJ |j                         dk(  sJ t        |j	                         D cg c]  \  }}|dk7  s| c}}      dk(  sJ t        j                  d	d
d      }t         j                  }t        j                  t         j                  |ddd       t        j                  t         j                  |ddd       t        j                  t         j                  |ddd       y c c}}w )Nr-   r   TrE   0   H   rP   r   r%   r/   r.   rG   rF   )r   r   r'   r   rI   r_   r`   ra   )r(   r   r*   r   HLGs        r   rN   z'TestHexagonalLatticeGraph.test_periodic   s    &&q!d;1v||vvx2~~!((*7*$!QQA*78A===&&q!d;((b&&QDAb&&QDAb&&QDA 8r   Nr   r
   r   r   r   r      s    K> 	-2
Br   r   )rm   	itertoolsr   r_   networkxr   networkx.utilsr   r   markparametrizer   r   r    r"   ro   r   r   r   r
   r   r   <module>r      s    C    &> b1123M3MN@@K! K!\)0 )0X@ @(,B ,B^.B .Br   