U
    mh)                  
   @   s4  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d5ddZd6d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'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 d!d"d#d$d%d&d'ge j#$ddd
ge j#$ddd
gd(d) Z)e j#$dej*ej&ej'ge j#$d*d+d,d-gd.d/ Z+e j#$dej*ej&ej'ge j#$de"e j#$ddd
ge j#$d0dd
ge j#$ddd
ge j#$d*d,d-gd1d2 Z,d3d4 Z-dS )7    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
   S/tmp/pip-unpacked-wheel-9oz00b9h/scipy/sparse/csgraph/tests/test_graph_laplacian.pycheck_int_type
   s     r   c                  C   sn   t ttfD ]^} ddgdgggdddgdddggddgddgddggfD ] }tj|| d}tttj| qFq
d S )N                  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   s6   t | r|  } t |r$| }t| |f| 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sBt|
jtjksRtt|	|dd t|
|dd nX|	j|ks~t|
j|kstt|	|}t|	|}t|	|dd t|
|dd |s|rt|st
|tjk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   Zfloat64AssertionErrorr1   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s4t|
j|ksBtt||}t||}t|	|dd t|
|dd |s|rt|st	|tj
krt|	| n|jdkrt|	| d S r:   )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"  dddgdddgdddgg}|t ||d}| }|sd| rddddgdddgdddgg}dddg}|r| rdddgd	ddgdddgg}dddg}|s| sdddgdddgdddgg}dddg}|r| sdddgd	ddgdddgg}dddg}t||||| |||d
 t||||| |||d
 d S )Nr   r   r   r   r   g      )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    




rK   fmtZcsrZcscr,   ZlilZdokZdiaZbsrc                 C   s*   t jddgddgd| d}t||| d S )Nr   rH   )r   r   )r#   r2   )r   Zdiagsr5   )rL   r'   r%   r	   r
   r
   r   test_sparse_formats   s    rM   formr   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;   rN   )r;   r<   rN   )r;   symmetrizedrN   )r;   rQ   r'   rN   )r;   r'   rN   )L_inL_outLs	Ls_normedLss
Lss_normedr   r   rT   rR   rS   rV   rU   rW   )r   arangereshaper   r   r4   r   r.   eyer   r1   )rC   rN   nr	   rR   Zd_inrS   Zd_outrT   ZdsrU   Z	ds_normedrV   ZdssrW   Z
dss_normedr*   rD   r
   r
   r   test_laplacian_symmetrized   sZ    







r\   rQ   c              	   C   s  d}dddgdddgdddgg}|t || d}tj|d|||| d\}}	tj|d|||| d	d
\}
}t|	| t||
 tj|d|||| |d
\}}t||	 |j| kst|t j||jd	| }t||ddd t 
ddd}|r| tkst||||  n d S )Nr   r   r   r   r   r   T)r;   r'   rQ   r<   r   r   )r;   r'   rQ   r<   r   rN   gH׊>)Zrtolr=   r   )r   r   r   r   r   r1   r   r>   rZ   r?   rX   rY   
INT_DTYPES)r   rC   r'   rQ   r<   rN   r[   r	   ZLoZdoZLadarD   r*   ZLmr&   r
   r
   r   test_format/  sN    	

	


	
r_   c               	   C   s2   t jtdd tjtddd} W 5 Q R X d S )NzInvalid form: 'toto')matchr   Ztoto)rN   )pytestr   r   r   r   r   rZ   )_r
   r
   r   test_format_error_messaged  s    rc   )F)T).ra   Znumpyr   Znumpy.testingr   r   r   Zscipyr   Zscipy.sparser   r   r   r+   r5   r6   r1   rE   rF   Zintcint_Zlonglongr]   ZsingledoubleZ
longdoubleZREAL_DTYPESZcsingleZcdoubleZclongdoubleZCOMPLEX_DTYPEStuplesortedstrZDTYPESmarkZparametrizer   r0   Z
coo_matrixrK   rM   r!   r\   r_   rc   r
   r
   r
   r   <module>   sf   

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