a
    Re*                  
   @   s@  d dl Z d dlZd dlmZ d dl mZ d dlmZ d dl	m
Z
 dd Zdd	 Zd/ddZd0ddZdd Zdd Zdd Zdd ZejejejhZejejejhZejejejhZee eeA eA e!dZ"e j#$de"e j#$dej%ej&ej'ej(ej)ge j#$ddd
ge j#$ddd
ge j#$ddd
gdd Z*e j#$d g d!e j#$ddd
ge j#$ddd
gd"d# Z+e j#$dej,ej&ej'ej(ej)ge j#$d$g d%d&d' Z-e j#$dej,ej&ej'ej(ej)ge j#$de"e j#$ddd
ge j#$d(dd
ge j#$ddd
ge j#$d$d)d*gd+d, Z.d-d. Z/dS )1    N)assert_allclose)raises)sparse)csgraphc                 C   s    t | jt jpt | jt jS N)npZ
issubdtypedtypeZsignedintegerZuint)mat r
   c/var/www/sunrise/env/lib/python3.9/site-packages/scipy/sparse/csgraph/tests/test_graph_laplacian.pycheck_int_type
   s    r   c                  C   sj   t ttfD ]Z} ddgdgggg dg dgddgddgddggfD ] }tj|| d}tttj| qBq
d S )	N   )r         )         r   r   r   r   r   )	intfloatcomplexr   arrayassert_raises
ValueErrorr   	laplacian)tmAr
   r
   r   test_laplacian_value_error   s    r   Fc                 C   s   t | r|  } t| } d|  }t|jd D ]8}| ||d d f  | |d |f   |||f< q2|rt|	 }d||dk< ||d d d f d  }||d d d f d  }|S )Ng      r   r   g      ?g      ?)
r   issparsetoarrayr   asarrayrangeshapesumZdiagcopy)xnormedyjdr
   r
   r   _explicit_laplacian   s    

6r+   Tc                 C   s(  t | dst| tttd} t| r4| }| } n
t| }t| }tj|dd}| j	d }t
| |d}tj| ||d}tj|||d}	|rt| | t|| n*|rt| st||  |jdkrt|	| t||	  ||	 fD ]8}
|st|
jdd	t| t|
j|
 t|
| qd S )
Nr#   )r   r   T)r%   r   )r'   )r'   r%   coo)Zaxis)hasattrevaldictr   r   r   r    
csr_matrixr%   r#   r+   r   r   r   _assert_allclose_sparser   formatr$   zerosT)r	   r'   r%   Zsp_matZmat_copyZsp_mat_copyZn_nodesZexplicit_laplacianr   Zsp_laplacianZtestedr
   r
   r    _check_symmetric_graph_laplacian)   s6    









r5   c                  C   s2   d} | D ]$}dD ]}dD ]}t ||| qqqd S )N)z,np.arange(10) * np.arange(10)[:, np.newaxis]znp.ones((7, 7))z
np.eye(19)z+sparse.diags([1, 1], [-1, 1], shape=(4, 4))z5sparse.diags([1, 1], [-1, 1], shape=(4, 4)).toarray()z5sparse.diags([1, 1], [-1, 1], shape=(4, 4)).todense()z3np.vander(np.arange(4)) + np.vander(np.arange(4)).T)TF)r5   )Zsymmetric_matsr	   r'   r%   r
   r
   r   test_symmetric_graph_laplacianN   s
    	r6   c                 K   s:   t | r|  } t |r$| }t| |fi | d S r   )r   r   r    r   )abkwargsr
   r
   r   r1   ^   s
    

r1   c                 C   s  || |d}t j||d||d d\}	}
|rpt|rp|	jtjksBJ |
jtjksRJ t|	|dd t|
|dd nX|	j|ks~J |
j|ksJ t||}t||}t|	|dd t|
|dd |s|rt|st	|tj
u rt|	| n|jdkrt|	| d S Nr   T)r'   return_diaguse_out_degreer%   r   g-q=)atolr,   )r   r   r   r   r   float64r1   r!   astypetypendarrayr   r2   r   Z	desired_LZ	desired_dr'   r<   r%   r   arr_typer	   Lr*   r
   r
   r   _check_laplacian_dtype_noneg   s4    
rE   c                 C   s   || |d}t j||d|||d\}	}
|	j|ks4J |
j|ksBJ t||}t||}t|	|dd t|
|dd |s|rt|st|tj	u rt
|	| n|jdkrt|	| d S r:   )r   r   r   r   r!   r?   r1   r   r@   rA   r   r2   rB   r
   r
   r   _check_laplacian_dtype   s*    

rF   )keyr   rC   r%   r'   r<   c           	   
   C   s   g dg dg dg}|t ||d}| }|sV| rVg dg dg dg}g d}|r|| r|g dg d	g dg}g d
}|s| sg dg dg dg}g d}|r| sg dg d	g dg}g d}t||||| |||d t||||| |||d d S )Nr   r   r   r   r   r   r   r   r   r   )r   r   )r   r   )r   r   r   )r   g      r   )r   r   )r   r   r   )r   rK   r   )rL   r   r   )r   r   r   )r   r   r   )r'   r<   r%   r   rC   )r   r   r%   rE   rF   )	r<   r'   r%   r   rC   r   ZA_copyrD   r*   r
   r
   r   test_asymmetric_laplacian   sd    rN   fmt)ZcsrZcscr,   ZlilZdokZdiaZbsrc                 C   s*   t jddgddgd| d}t||| d S )Nr   rK   )r   r   )r#   r2   )r   Zdiagsr5   )rO   r'   r%   r	   r
   r
   r   test_sparse_formats   s    rP   form)r   functionloc                 C   sP  d}| t || ||}tj|d|d\}}tj|dd|d\}}tj|dd|d\}}	tj|ddd|d\}
}||j7 }tj|d|d\}}tj|dd|d\}}t|	||  t|	| t|| i }dD ]6}|d	krt|||< qt|t j||j	d
||< qt
|d |d |d j  t
|d |d  t
|d |d  d S )Nr   T)r;   rQ   )r;   r<   rQ   )r;   symmetrizedrQ   )r;   rT   r'   rQ   )r;   r'   rQ   )L_inL_outLs	Ls_normedLss
Lss_normedr   r   rW   rU   rV   rY   rX   rZ   )r   arangereshaper   r   r4   r   r.   eyer   r1   )rC   rQ   nr	   rU   Zd_inrV   Zd_outrW   ZdsrX   Z	ds_normedrY   ZdssrZ   Z
dss_normedr*   rD   r
   r
   r   test_laplacian_symmetrized   sZ    








r_   rT   rR   rS   c              	   C   s  d}g dg dg dg}|t || d}tj|d|||| d\}}	tj|d|||| dd	\}
}t|	| t||
 tj|d|||| |d	\}}t||	 |j| ksJ |t j||jd| }t||d
d
d t 	d
dd}|r| tv st||||  n d S )Nr   rH   rI   rJ   r   T)r;   r'   rT   r<   r   r   )r;   r'   rT   r<   r   rQ   gH׊>)Zrtolr=   r   r   )r   r   r   r   r   r1   r   r]   r?   r[   r\   
INT_DTYPES)r   rC   r'   rT   r<   rQ   r^   r	   ZLoZdoZLadarD   r*   ZLmr&   r
   r
   r   test_format5  sN    

	


	
rb   c                  C   sF   t jtdd$ tjtddd} W d    n1 s80    Y  d S )NzInvalid form: 'toto')matchr   Ztoto)rQ   )pytestr   r   r   r   r   r]   )_r
   r
   r   test_format_error_messagen  s    rf   )F)T)0rd   numpyr   Znumpy.testingr   r   r   Zscipyr   Zscipy.sparser   r   r   r+   r5   r6   r1   rE   rF   Zintcint_Zlonglongr`   singledoubleZ
longdoubleZREAL_DTYPESZcsingleZcdoubleZclongdoubleZCOMPLEX_DTYPEStuplesortedstrZDTYPESmarkZparametrizer   r0   Z
coo_matrixZ	csr_arrayZ	coo_arrayrN   rP   r!   r_   rb   rf   r
   r
   r
   r   <module>   sr   


%	!<5-