a
    .'aU                     @   s   d Z ddlZddlmZ ddlmZmZmZm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mZmZ dd	lmZ dd
lmZ g dZdddZG dd dZdS )z)test sparse matrix construction functions    N)array)assert_equalassert_assert_array_equalassert_array_almost_equal_nulp)raises)check_free_memory)check_random_state)
csr_matrix
coo_matrix	construct)rand)matrix)csrcsccooZbsrdialilZdok{Gz?r   c              	   C   s$   t |}|j}t| ||||||S )N)r	   Zstandard_normalr   random)mndensityformatdtyperandom_stateZdata_rvs r   @lib/python3.9/site-packages/scipy/sparse/tests/test_construct.py_sprandn   s
    r   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zejjejd%d&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Z d6d7 Z!d8d9 Z"d:S );TestConstructUtilsc           
      C   s  t g dg}t g dg dg}t g dg dg dg}g }||ddddggf ||dgdddggf ||dgdddgdggf ||dgddddggf ||dgddddggf ||dgddddggf ||dgddddgddggf ||dgddddgddggf ||dgddddgddggf ||dgdd	g d
g dg dgf ||dgdd	g dg dg dgf ||dgddg dg dg dgf ||ddgddg dg dg dgf ||ddgdd	g dg dg dgf ||ddgddg dg dg dg dg dg dgf ||g d ddg d!g d"g d#g d$g d%g dgf ||g d&ddg d'g d(g d)g d*g d+g d,gf |D ]*\}}}}}	tt|||| |	 qd 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   )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   r2   r   r!   )r'   r.   r   r   r   r   )r!   r(   r/   r   r   r   )r   r"   r)   r0   r   r   )r   r   r#   r*   r1   r   )r   r   r   r$   r+   r   r"   r2   )r   r   r)   r   r   )r-   r   r   r*   r   )r   r.   r   r   r+   r   r   r/   r   r   r!   r   r   r0   r   r   r"   r   r   r1   )r   appendr   r   Zspdiagstodense)
selfZdiags1Zdiags2Zdiags3casesdor   r   resultr   r   r   test_spdiags   s\    """(((**zTestConstructUtils.test_spdiagsc           
      C   s*  t g d}t g d}t g d}g }||d d dddggf ||d d gdgddggf ||d d gdgddgdggf ||d d gdgdddggf ||d d gdgdddggf ||d d	 gdgd
ddgdd	ggf ||d d gdgd
ddgddggf ||d d gdgdg dg dg dgf ||d d gdgdg dg dg dgf ||d d gdgdg dg dg dgf ||d d	 gdgdg dg dg dgf ||d d gdgdg dg dg dgf ||d d gdgdg dg dg dgf ||d d gd	gdg dg dg dgf ||d d	 gdgdg d g d!g dgf ||d d gd"gdg d#g dg dgf ||d d gd$gd%g d&g d&g d&g d&g d'gf ||d d	 gd(gd%g d&g d&g d&g d'g d)gf ||d d gdgd%g d&g d&g d'g d)g d*gf ||d d gdgd%g d&g d'g d)g d*g d&gf ||d d gdgd%g d'g d)g d*g d&g d&gf ||d d	 gdgd%g d+g d,g d&g d&g d&gf ||d d gd	gd%g d-g d&g d&g d&g d&gf ||d d |d d gdd	gd.g d/g d)g d*gf ||d d	 |d d gddgdg d0g d1g d2gf ||d d" |d d gd	d(gd3g d4g d5g d6g d7g d8g d9gf ||d d" ||d d" gg d:d;g d<g d=g d>g d?g d@gf ||d d	 |d d |gg dAdBg dCg dDg dEg dFg dGg dHgf ||gdgddggf ||d d |gdd	gd.g d/g d)g d*gf |t g dIg dJgddgd.g d'g dKg dLgf |g dMg dNd.g dOg dMg dPgf |D ]\}}}}dQ||||f }	ttj|||dR ||	dS |d |d krt|d dTrt|d t	|krtt|| ||	dS qd S )UNr    r&   r,   r!   r   r!   r!   r"   r!   r!   r"   r"   r"   r"   r2   r#   )r#   r$   r3   r4   r5   )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   r6   )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!   rA   )r%   r#   )r   r   r   r!   r   r   r<   r7   r8   r   r!   r   )r   r   r"   r   r   r!   )r#   r#   )r!   r   r'   r9   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*   r0   )r   r   r   r$   r+   r@   r'   r%   )r   r   r'   r   r   )r-   r   r   r(   r   )r   r.   r   r   r)   rB   rC   rD   r!   r"   r#   )r$   r%   r'   )r$   r"   r   )r   r%   r#   )r!   rQ   r!   )r!   r   r2   )rQ   r!   r   )r   r!   rQ   z%r %r %r %rshape)err_msg__len__)
r   rE   npr   r   diagsrF   hasattrlenmax)
rG   abcrH   rI   rJ   rZ   rK   r[   r   r   r   
test_diagsM   s    "&$$**000000000<<<<<<<<<(**4:8zTestConstructUtils.test_diagsc                 C   s*   t g d}tt| t| d S )Nr    )r   r   r   r^   rF   r]   diagrG   rb   r   r   r   test_diags_default   s    z%TestConstructUtils.test_diags_defaultc                 C   s&   t g dg dg}tttj| d S )Nr    )r"   r#   r$   r%   r'   )r   assert_raises
ValueErrorr   r^   rg   r   r   r   test_diags_default_bad   s    z)TestConstructUtils.test_diags_default_badc                 C   s6  t g d}t g d}t g d}g }||d d gddf ||d d ||d d gg dd	f ||d d
 ||d d gg ddf ||d d
 ||d d gg dd f |g g dd f |dgdgdf ||gdd f |D ]\}}}tttj||| qtttjd ggdg d S )Nr    r&   r,   r   rM   r$   r#   r?   rV   r"   r@   rW   r!   )r$   r$   )r   rE   ri   rj   r   r^   	TypeError)rG   rb   rc   rd   rH   rI   rJ   rZ   r   r   r   test_diags_bad   s    ***z!TestConstructUtils.test_diags_badc                    s   t jd dD ]}d|d  t jdd  t   d  d }t j| |d | } fdd|D }t||}td	d t	||D }t
| | t|dkrt|d |d }t |d |d }t
| | qd S )
Ni  )r!   r"   r#   r$   r%   r+   r!   r"   r   r+   c                    s    g | ]}t j t| qS r   )r]   r   r   abs).0qr   r   r   
<listcomp>       z9TestConstructUtils.test_diags_vs_diag.<locals>.<listcomp>c                 S   s   g | ]\}}t ||qS r   )r]   rf   )rp   xjr   r   r   rs      rt   )r]   r   ZseedZrandintZarangeZshuffler   r^   sumzipr   rF   r`   rf   )rG   Zn_diagsZoffsetsZ	diagonalsZmatZ	dense_matr   rr   r   test_diags_vs_diag   s    z%TestConstructUtils.test_diags_vs_diagc                 C   s@   t jdgdgdtd}t|jt t| ddgddgg d S )Ng@r   rP   )rZ   r   r"   )r   r^   intr   r   rF   rG   ru   r   r   r   test_diags_dtype   s    z#TestConstructUtils.test_diags_dtypec                 C   sF   t td}tddD ]*}tt|| t|g|g  qd S )Nr%   rl   r'   )listranger   r   r^   toarray)rG   rI   kr   r   r   test_diags_one_diagonal   s
    z*TestConstructUtils.test_diags_one_diagonalc                 C   s   t g }t|jd d S )Nr   r   )r   r^   r   rZ   r{   r   r   r   test_diags_empty   s    
z#TestConstructUtils.test_diags_emptyc                 C   s   t td dgg t td ddgddgg tjdddd}t |jtd t |jd tD ]>}tjd|d}t |j| t | g d	g d
g dg qjd S Nr!   r"   r   r#   Zint8r   )r   r   r   rS   rT   rU   )r   r   Zidentityr   r   r]   r   sparse_formatsrG   Ifmtr   r   r   test_identity   s     z TestConstructUtils.test_identityc              
   C   s$  t tdd dgg t tdd g dg dg t tdd ddgddgddgg t tdd g dg dg dg t tjdddd	jtd d
D ]p}d
D ]f}tddD ]V}t tj|||d tj|||d ||krt tj||d tj|||d qqqd S )Nr!   r"   r#   rS   rT   r   rU   Zint16r   rR   rl   r'   )r   )r   r   eyer   r   r]   r~   )rG   r   r   r   r   r   r   test_eye   s    "((&zTestConstructUtils.test_eyec                 C   s   t td dgg t td ddgddgg tjdddd}t |jtd t |jd tD ]>}tjd|d}t |j| t | g d	g d
g dg qjd S r   )r   r   r   r   r   r]   r   r   r   r   r   r   test_eye_one   s     zTestConstructUtils.test_eye_onec                 C   s  g }| tdgg | tdgg | tdgg | tdgg | tdgdgg | tddgg | tddgddgg | tddgddgg | tg d	g d
g | tddgddgddgg | tg dg dg dg | tg dg | tg dg dg |D ]\}|D ]P}t||}tD ]8}tjt|t||d}t|j| t	|
 | qRq>q6d S )Nr   r2   r$   r+   r!   r"   r#   r%   r   r"   ir)   r   r0   r'   )r%   r$   r$   rS   )r'   r   r)   )r   r!   r   r"   r   r%   r)   )      ?g      ?r   g      
@)r   g      @r   r   r   )rE   r   r]   kronr   r   r
   r   r   r   rF   )rG   rH   rb   rc   expectedr   rK   r   r   r   	test_kron  s*      zTestConstructUtils.test_kronc                 C   sD   d}t d||d }t |dd| }t || t || d S )Ni   r!   )r   r   r   )rG   r   rb   rc   r   r   r   test_kron_large  s
    z"TestConstructUtils.test_kron_largec              
   C   s&  g }| tdgg | tdgg | tdgg | tdgg | tddgddgg | tddgddgg | tg d	g d
g dg | tg dg dg dg |D ]\}|D ]R}tt|t| }ttt	||t|tt	| }t
|| qqd S )Nr   r2   r$   r+   r!   r"   r#   r%   r   r   )r   r#   r   rS   )r   r%   r2   )r$   rQ   r)   )rE   r   r   Zkronsumr
   rF   r]   r   r   r`   r   )rG   rH   rb   rc   rK   r   r   r   r   test_kronsum#  s       zTestConstructUtils.test_kronsumc                 C   s  t ddgddgg}t ddgg}tddgddgddgg}tt||g | ttj||gtjdjtj tt|	 |	 g | ttj|	 |	 gtjdjtj ttj|	 |	 gtjdj
jtj ttj|	 |	 gtjdjjtj d S )Nr!   r"   r#   r$   r%   r'   r   )r   r   r   r   ZvstackrF   r]   float32r   Ztocsrindicesint32indptrrG   ABr   r   r   r   test_vstack6  s0    zTestConstructUtils.test_vstackc                 C   s   t ddgddgg}t dgdgg}tg dg dg}tt||g | ttj||gtjd	jtj tt|	 |	 g | ttj|	 |	 gtjd	jtj d S )
Nr!   r"   r#   r$   r%   r'   r!   r"   r%   r#   r$   r'   r   )
r   r   r   r   ZhstackrF   r]   r   r   Ztocscr   r   r   r   test_hstackI  s    zTestConstructUtils.test_hstackc                 C   s  t ddgddgg}t dgdgg}t dgg}t d}tg d	g d
g dg}tt||gd |gg | tg dg dg dg}tt|d gd |gg | tddgddgddgg}ttd |g|d gg | ttd}ttd d gg | ttd |g|d gg | tdgg}ttd |g|d gg | tt	"}t|g|gg W d    n1 s0    Y  |
d tt	 }t||gg W d    n1 s0    Y  |
d d S )Nr!   r"   r#   r$   r%   r'   r(   r   r   r   )r   r   r(   )r!   r"   r   )r#   r$   r   r   z.Got blocks\[1,0\]\.shape\[1\] == 1, expected 2z.Got blocks\[0,1\]\.shape\[0\] == 1, expected 2)r   r   r   r   ZbmatrF   r]   emptyri   rj   match)rG   r   r   CDr   excinfor   r   r   	test_bmatW  s<         
2

0zTestConstructUtils.test_bmatz!Can't create large array for testc                 C   s|   t d d}ttj||ftd}| }t||fd}tt	t
t|j| t|jjtj t|jjtj dS )z6 test for indptr overflow when concatenating matrices i0u  i  r   r   N)r   r
   r]   Zonesboolcopyr   Z_compressed_sparse_stackr   allZequalZdiffr   r   r   r   int64)rG   r   r   r   r   r   r   r   test_concatenate_int32_overflow~  s    z2TestConstructUtils.test_concatenate_int32_overflowc                 C   st   t ddgddgg}t dgdgg}t dgg}tg dg d	g d
g dg dg}tt|||f | dS )z basic test for block_diag 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(   N)r   r   r   r   
block_diagrF   )rG   r   r   r   r   r   r   r   test_block_diag_basic  s    z(TestConstructUtils.test_block_diag_basicc                 C   s,   t tddgdg g dg dg dS )z) block_diag with scalar and 1d arguments r"   r#   r$   )r"   r#   r   )r   r   r$   N)r   r   r   r   rG   r   r   r   test_block_diag_scalar_1d_args  s    z1TestConstructUtils.test_block_diag_scalar_1d_argsc                 C   s   t tddgg tddgg t tddggg tddgg t tdgdggg tdgdgg t tdg tdgg dS )z block_diag with one matrix r!   r   N)r   r   r   rF   r   r   r   r   r   test_block_diag_1  s    
z$TestConstructUtils.test_block_diag_1c              	   C   s   t g dgddt ddggddg}t|}t| tg dg dg t d	gd
gdggddt dgdggddg}t|}t| td	dgd
dgddgddgddgg dS )z! block_diag with sparse matrices rX   )r!   r#   rY   r$   r%   rO   )r!   r"   r#   r   r   )r   r   r   r$   r%   r!   r"   r#   )r#   r!   rN   r   N)r   r   r   r   rF   r   )rG   Zsparse_col_matricesZblock_sparse_cols_matricesZsparse_row_matricesZblock_sparse_row_matricesr   r   r   test_block_diag_sparse_matrices  s    

$z2TestConstructUtils.test_block_diag_sparse_matricesc              	      sL  t tfD ]< tjtjtjtjtjtjtj	fD ]8} ddd|d}t
|j| t
|jd t
|jd q. ddddd}t
|jtj  dddtjdd}t|j|j t|j|j t|j|j dD ].} dd|d	}t
|jt|t|j  qd
D ] } dd|d}t
|j| q tt fdd tt fdd qd S )Nr%   r+   皙?)r   r   )r%   r+     )r   r   )g        r   r   g      ?r   )r   r   r   r   r   c                      s    dddS )Nr%   r+   g?r   r   fr   r   <lambda>  rt   z9TestConstructUtils.test_random_sampling.<locals>.<lambda>c                      s    dddS )Nr%   r+   gr   r   r   r   r   r     rt   )sprandr   r]   r   float64Z
longdoubler   r   Z	complex64Z
complex128r   r   rZ   ZnnzZdoubler   RandomStater   datarowcolrz   Zprodr   ri   rj   )rG   tru   Zx1Zx2r   r   r   r   r   test_random_sampling  s0    
z'TestConstructUtils.test_random_samplingc                 C   s   d dt j g}zt j }|| W n ty:   Y n0 |D ]H}tdddt j|d}tt 	t 
d|j tt 	t 
|jd q@d S Nr   r+      r   )r   r   r   r   r!   )r]   r   r   default_rngrE   AttributeErrorr   r   r   r   Z
less_equalr   rG   Zrandom_statesgenr   ru   r   r   r   	test_rand  s    
zTestConstructUtils.test_randc                 C   s   d dt j g}zt j }|| W n ty:   Y n0 |D ]H}tdddt j|d}tt 	t 
|jd tt 	t 
d|j q@d S r   )r]   r   r   r   rE   r   r   r   r   anyZlessr   r   r   r   r   
test_randn  s    
zTestConstructUtils.test_randnc                 C   s   t jdddd d S )Nr+   rI   r   )r   r   r   r   r   r   test_random_accept_str_dtype  s    z/TestConstructUtils.test_random_accept_str_dtypec                 C   s"   t jdddd}t| d d S )Nr+   gx&1?r   r/   )r   r   r   Zcount_nonzero)rG   Zsparse_matrixr   r   r   Etest_random_sparse_matrix_returns_correct_number_of_non_zero_elements   s    zXTestConstructUtils.test_random_sparse_matrix_returns_correct_number_of_non_zero_elementsN)#__name__
__module____qualname__rL   re   rh   rk   rn   ry   r|   r   r   r   r   r   r   r   r   r   r   r   pytestZmarkZslowZxfail_on_32bitr   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s<   /G'
r   )r   r   NN)__doc__Znumpyr]   r   Znumpy.testingr   r   r   r   r   r   ri   Zscipy._lib._testutilsr   Zscipy._lib._utilr	   Zscipy.sparser
   r   r   Zscipy.sparse.constructr   r   Zscipy.sparse.sputilsr   r   r   r   r   r   r   r   <module>   s   
