
    _-Ph<                         d Z ddlZddlmZ ddlmZ ddlm	Z	m
Z
mZ ddlmZmZ ddlmZmZmZmZmZ ddlmZ dd	lmZ d
 Zd Zd Z G d de	          Z G d de	          Z G d de	          Zd Zd Zd Z d Z!dS )zTest graph routings.    N)sparse)bellman_ford)TestCaseassert_equalassert_array_almost_equal)poissonload_example)maximal_independent_setvertex_coloringr   lloyd_clusterconnected_components)bellman_ford_reference)amg_corec                     t          j        |           } | j        | j        k    }| j        |         | _        | j        |         | _        | j        |         | _        d| j        d d <   | S N   )r   
coo_matrixrowcoldata)Gmasks     V/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/pyamg/tests/test_graph.pycanonical_graphr      s\     	!A5AE>DE$KAEE$KAEVD\AFAF111IH    c                     t          |           } | j        dk    r3|| j                 || j                 z                                   dk    sJ || |z  z                                   dk    sJ d S )Nr   r   )r   nnzr   r   maxmin)r   miss     r   assert_is_misr!      su    A 	uqyyAE
SZ',,..!3333!C%K!######r   c                     t          |           } || j                 || j                 k                                    sJ t	          j        |          dk                                    sJ d S )Nr   )r   r   r   allnpbincount)r   cs     r   assert_is_vertex_coloringr'   '   se    A aeH!% %%'''''KNNQ##%%%%%%%r   c                   2    e Zd Zd Zd Zd Zd Zd Zd ZdS )	TestGraphc                 *   g }t           j                            d           t          d          D ]h}t           j                            dd          dk    }|                    t          ||j        z                                 t                               i|                    t          j
        d                     |                    t          j
        d                     |                    t          j
        d                     |                    t          j        d          t          j        d          z
             |                    t          d	                     |                    t          d
                     |                    t          d                     |                    t          d                     dD ]*}|                    t          |          d                    +d |D             }|| _        d S )Nig&            ?)r   r   )   r.   )r,   r,   r.   r+   )r+   r+   )   r0   )r+   r+   r+   )airfoilbarknotAc                 ,    g | ]}t          |          S  r   .0r   s     r   
<listcomp>z#TestGraph.setUp.<locals>.<listcomp>D   s     333##333r   )r$   randomseedrangerandappendr   Tastypefloatzerosoneseyer   r	   cases)selfrF   _ir4   names        r   setUpzTestGraph.setUp1   s   
	y!!!(( 	A 	AB	q!$$s*ALLQS1188??@@@@RXf%%&&&RXf%%&&&RXf%%&&&RWV__rvayy0111WT]]###WV__%%%WX&&'''WY''(((. 	2 	2DLLd++C0111133U333


r   c                    t          t          t          j        d                    ddg           dD ]-}| j        D ]#}t          ||          }t          ||           $.| j        D ]b}dD ]]}t          ||          }|dk    r4|t          j        |j        d                   z   |z  }t          |          }t          ||           ^cd S )Nr.   r   serialparallelalgo)r   r.         )kr   )r   r
   r$   rE   rF   r!   shaper   )rG   rP   r   r    rS   s        r   test_maximal_independent_setz&TestGraph.test_maximal_independent_setH   s    ,RVAYY77!Q@@@* 	& 	&DZ & &-ad;;;a%%%%&  	& 	&A! & &-a1555q55RVAGAJ///!3A'**Aa%%%%&	& 	&r   c           	         t          t          t          j        d                    dg           t          t          t          j        d                    g d           t          t	          t          t          j        d                              g d           dD ]-}| j        D ]#}t          ||          }t          ||           $.d S )	Nr   r   rQ   )r   r   r   )rQ   rQ   )r   r   r.   MISJPLDFmethod)r   r   r$   rE   sortedrD   rF   r'   rG   r\   r   r&   s       r   test_vertex_coloringzTestGraph.test_vertex_coloringY   s    _RVAYY//!555_RVAYY//;;;VOBGFOO<<==yyyIII* 	0 	0FZ 0 0#Af555)!Q////0	0 	0r   c                    t           j                            d           | j        D ]R}t           j                            |j                  |_        |j        d         }t          |dz            t          |dz            |dz
  |fD ]}||j        d         k    s|dk     rt           j        	                    |          d|         }t          ||          \  }}t          ||          \  }}t          ||           t          ||           |j        d         dk     rWt          |j        	          }	|	dd|f                             d
                                          }
t          ||
           TdS )z4Test pile of cases against reference implementation.iar      
   r.   r   N   )csgraph)axis)r$   r;   r<   rF   r>   r   r   rT   intpermutationr   r   r   bellman_ford_scipyr@   r   ravel)rG   r   Nn_seedsseedsD_resultS_result
D_expected
S_expectedDD_scipys              r   test_bellman_fordzTestGraph.test_bellman_fordd   sp   
	z""" 	A 	AAY^^AE**AF
A"IIs1R4yy!A#q9 A AQWQZ''7Q;;	--a00':%1!U%;%;"()?5)I)I&
J)(J???)(J??? 71:??*13777A5koo1o55;;==G-h@@@!A		A 	Ar   c                    t          j        ddgddgddgddgddgddgddgddgg          }t          j        g dt                    }t          j        ||d d df         |d d df         ff          }t          j        g dt           j        d	d
ddgt           j        t           j        d	t           j        t           j        gt           j        ddd	d
gt           j        dddd	gg          }t          d          D ]V}t          ||g          \  }}t          |||                    t          ||g          \  }}t          |||                    Wd S )Nr   rR   rQ   r   r.   )r.   r   r.   r   rR   r+   rQ   r   dtype)              ?      @      @rz   rw   rz   g       @rx   ry   g      @r+   )
r$   arrayrB   r   r   infr=   r   r   r   )rG   Edgeswr   distances_FROM_seedr<   distancenearests           r   test_bellman_ford_referencez%TestGraph.test_bellman_ford_reference~   s   1a&a&a&a&a&a&a&a&" # # H---U;;;q5A;aaad"<=>> h(H(H(H)+RR(H)+RVRV(L)+RR(H)+RR(H	(J K K !HH 	> 	>D 6q4& A AHg#6t#<=== ,Q 7 7Hg#6t#<====	> 	>r   c                     t           j                            d           | j        D ]V}t           j                            |j                  |_        dD ](}||j        d         k    rt          ||          \  }}})Wd S )Nl   t r/   r   	r$   r;   r<   rF   r>   r   r   rT   r   rG   r   rk   	distancesclusterscenterss         r   test_lloyd_clusterzTestGraph.test_lloyd_cluster   s    
	z""" 	I 	IAY^^AE**AF I IQWQZ''/<Q/H/H,	8WW	I	I 	Ir   N)	__name__
__module____qualname__rJ   rU   r_   rs   r   r   r6   r   r   r)   r)   0   sv          .& & &"	0 	0 	0A A A4> > >0
I 
I 
I 
I 
Ir   r)   c                   &    e Zd Zd Zd Zd Zd ZdS )TestComplexGraphc                 ^   g }t           j                            d           t          d          D ]h}t           j                            dd          dk    }|                    t          ||j        z                                 t                               id |D             }|| _
        d S )Nl   ko r+   r,   r-   c                 R    g | ]$}t          |          d t          |          z  z   %S               ?r7   r8   s     r   r:   z*TestComplexGraph.setUp.<locals>.<listcomp>   s2    KKK##D););$;;KKKr   )r$   r;   r<   r=   r>   r?   r   r@   rA   rB   rF   )rG   rF   rH   r4   s       r   rJ   zTestComplexGraph.setUp   s    
	z"""(( 	A 	AB	q!$$s*ALLQS1188??@@@@KKUKKK


r   c                     t          t          t          j        d                    ddg           dD ]-}| j        D ]#}t          ||          }t          ||           $.d S )Nr.   r   rL   rO   )r   r
   r$   rE   rF   r!   )rG   rP   r   r    s       r   rU   z-TestComplexGraph.test_maximal_independent_set   s{    ,RVAYY77!Q@@@* 	& 	&DZ & &-ad;;;a%%%%&	& 	&r   c                 f    dD ]-}| j         D ]#}t          ||          }t          ||           $.d S )NrW   r[   )rF   r   r'   r^   s       r   r_   z%TestComplexGraph.test_vertex_coloring   sV    * 	0 	0FZ 0 0#Af555)!Q////0	0 	0r   c                 P   t           j                            d           | j        D ]~}t           j                            |j                  dt           j                            |j                  z  z   |_        dD ](}||j        d         k    rt          ||          \  }}})d S )Ni$}r   r/   r   r   r   s         r   r   z#TestComplexGraph.test_lloyd_cluster   s    
	z""" 	I 	IAY^^AE**T")..2G2G-GGAF I IQWQZ''/<Q/H/H,	8WW	I	I 	Ir   N)r   r   r   rJ   rU   r_   r   r6   r   r   r   r      sU        
 
 
& & &0 0 0
I 
I 
I 
I 
Ir   r   c                        e Zd Zd Zd Zd ZdS )TestVertexColoringsc           	         t          j        g dg dg dg dg dg          }t          j        |          | _        t          | j        | j        j        z
  j        d           t          j        g dg dg d	g d
g dg dg          }t          j        |          | _        t          | j        | j        j        z
  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   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   r   r   r   r   r   )	r$   r{   r   
csr_matrixG0r   r@   r   G1)rG   r   r   s      r   rJ   zTestVertexColorings.setUp   s     X&&&&	( ) )
 #B''dg	).222
 X))))))))))))))))))+ , , #B''dg	).22222r   c                    t           j        }t          j        g dd          }t          j        dd          } || j        j        d         | j        j        | j        j        ||           t          |g d           t          j        g dd          }t          j        d	d          } || j
        j        d         | j
        j        | j
        j        ||           t          |g d
           d S )Ng?皙?g?gffffff?g333333?float64ru   r+   intcr   r.   r   r   r   r.   r   皙?333333?r   r   r      )r.   r   r   r   r.   r   )r   vertex_coloring_jones_plassmannr$   r{   emptyr   rT   indptrindicesr   r   rG   fnweightscolorings       r   test_vertex_coloring_JPz+TestVertexColorings.test_vertex_coloring_JP   s    5(444IFFF8AV,,,
47=TW^TW_h	 	 	X///(999KKK8AV,,,
47=TW^TW_h	 	 	X11122222r   c                    t           j        }t          j        g dd          }t          j        dd          } || j        j        d         | j        j        | j        j        ||           t          |g d           t          j        g dd          }t          j        d	d          } || j
        j        d         | j
        j        | j
        j        ||           t          |g d
           d S )Nr   r   ru   r+   r   r   r   r   r   )r.   r   r   r.   r   r   )r   vertex_coloring_LDFr$   r{   r   r   rT   r   r   r   r   r   s       r   test_vertex_coloring_LDFz,TestVertexColorings.test_vertex_coloring_LDF   s    )(444IFFF8AV,,,
47=TW^TW_h	 	 	X///(999KKK8AV,,,
47=TW^TW_h	 	 	X11122222r   N)r   r   r   rJ   r   r   r6   r   r   r   r      sA        3 3 343 3 33 3 3 3 3r   r   c                     ddl m}  | }t          j        g dg dg dg dg          }t	           ||d          d         g d           t	           ||d          d         g d	           t	           ||d
          d         g d           t	           ||d          d         g d           t          j        g dg dg dg dg          }t	           ||d          d         g d           t	           ||d          d         g d           t	           ||d
          d         g d           t	           ||d          d         g d           d S )Nr   )breadth_first_searchr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r.   rQ   )r   r   r   r.   r.   )r.   r   r   r   rQ   )rQ   r.   r   r   r   r   r   r   )r   r   r.   )r   r   r   r   )r.   r   r   r   )r   r   r   r   )pyamg.graphr   r   r   r   )r   BFSr   s      r   test_breadth_first_searchr     s   000000
C<<<'<<'<<'<<) 	* 	*A
 Q1|||,,,Q1|||,,,Q1|||,,,Q1|||,,,<<<'<<'<<'<<) 	* 	*A
 Q1}}}---Q1}}}---Q1}}}---Q1/////r   c                     g } |                      t          j        g dg dg dg dg                     |                      t          j        g dg dg dg dg                     |                      t          j        g dg dg dg dg                     |                      t          j        g dg dg dg dg                     |                      t          j        g dg d	g d
g dg dg dg                     |                      t          j        g dg dg d
g dg dg dg                     |                      t          j        g dg dg d
g dg dg dg                     | D ]`}t          |          }t	          |                                d           d } ||          }t          |          }t	          ||           ad 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   r   r   r   r   r   r   r   r   r   r   r   r   r   r   c                     i }t          |           D ]}t                      ||<   t          |           D ] \  }}||                             |           !d |                                D             S )$Convert array to set of sets format.c                 ,    h | ]}t          |          S r6   	frozensetr9   ss     r   	<setcomp>zJtest_connected_components.<locals>.array_to_set_of_sets.<locals>.<setcomp>b      555QIaLL555r   set	enumerateaddvaluesarrrq   ins       r   array_to_set_of_setsz7test_connected_components.<locals>.array_to_set_of_sets[  u    AXX  uu!!#  1!55!((**5555r   r?   r   r   r   r   r   reference_connected_componentsrF   r   resultr   expecteds        r   test_connected_componentsr      s   E	LL"LLL$0LL$0LL$0LL$2 3 3 4 4 4
 
LL"LLL$0LL$0LL$0LL$2 3 3 4 4 4
 
LL"LLL$0LL$0LL$0LL$2 3 3 4 4 4
 
LL"LLL$0LL$0LL$0LL$2 3 3 4 4 4 
LL"$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$8 9 9 : : : 
LL"$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$8 9 9 : : : 
LL"$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$8 9 9 : : :  ' '%a((VZZ\\1%%%	6 	6 	6 &%f--1!44VX&&&&#' 'r   c                     g } |                      t          j        g dg dg dg dg                     |                      t          j        g dg dg dg dg                     |                      t          j        g dg dg dg dg                     |                      t          j        g dg dg dg dg                     |                      t          j        g dg d	g d
g dg dg dg                     |                      t          j        g dg dg d
g dg dg dg                     |                      t          j        g dg dg d
g dg dg dg                     d | D             } | D ]`}t          |          }t	          |                                d           d } ||          }t          |          }t	          ||           ad S )Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   c                     g | ]
}|d |z  z   S r   r6   r8   s     r   r:   z5test_complex_connected_components.<locals>.<listcomp>  s     %%%!QtAvX%%%r   r   c                     i }t          |           D ]}t                      ||<   t          |           D ] \  }}||                             |           !d |                                D             S )r   c                 ,    h | ]}t          |          S r6   r   r   s     r   r   zRtest_complex_connected_components.<locals>.array_to_set_of_sets.<locals>.<setcomp>  r   r   r   r   s       r   r   z?test_complex_connected_components.<locals>.array_to_set_of_sets  r   r   r   r   s        r   !test_complex_connected_componentsr   j  s   E	LL"LLL$0LL$0LL$0LL$2 3 3 4 4 4
 
LL"LLL$0LL$0LL$0LL$2 3 3 4 4 4
 
LL"LLL$0LL$0LL$0LL$2 3 3 4 4 4
 
LL"LLL$0LL$0LL$0LL$2 3 3 4 4 4 
LL"$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$8 9 9 : : : 
LL"$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$8 9 9 : : : 
LL"$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$6$8 9 9 : : : &%u%%%E  ' '%a((VZZ\\1%%%	6 	6 	6 &%f--1!44VX&&&&#' 'r   c                 4   |                                  } | j        d         }fdt                      }t                      }t          |          D ]D}||vr>t                      } || ||           |                    t          |                     E|S )Nr   c                     | |vrc|                     |            |                     |            |j        |j        |          |j        | dz                     D ]} ||||           d S d S r   )r   r   r   )r   r   	componentvisitedjDFSs        r   r   z+reference_connected_components.<locals>.DFS  s    GMM!KKNNNYqx{18AaC=89 . .Aq)W----	 . .r   )tocsrrT   r   r=   r   r   )r   rj   r   
componentsr   r   r   s         @r   r   r     s    			A	
A. . . . . eeGJ1XX 1 1GIC1i)))NN9Y//000r   )"__doc__numpyr$   scipyr   scipy.sparse.csgraphr   rh   numpy.testingr   r   r   pyamg.galleryr   r	   r   r
   r   r   r   pyamg.graph_refr   pyamgr   r   r!   r'   r)   r   r   r   r   r   r   r6   r   r   <module>r      s               C C C C C C K K K K K K K K K K / / / / / / / /L L L L L L L L L L L L L L 2 2 2 2 2 2        $ $ $& & &pI pI pI pI pI pI pI pIf&I &I &I &I &Ix &I &I &IR73 73 73 73 73( 73 73 73t0 0 04G' G' G'TJ' J' J'\    r   