o
    EbS_                     @   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_normal	constructrandom)mndensityformatdtyperandom_stateZdata_rvs r   C/usr/lib/python3/dist-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|||| |	 qgd 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   r3   r   r"   )r(   r/   r   r   r   r   )r"   r)   r0   r   r   r   )r   r#   r*   r1   r   r   )r   r   r$   r+   r2   r   )r   r   r   r%   r,   r   r#   r3   )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   r   r#   r   r   r2   )r   appendr   r   Zspdiagstoarray)
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 ]G\}}}}dQ||||f }	ttj|||dR ||	dS |d |d krt|d dTrt|d t	|krtt|| ||	dS qKd S )UNr!   r'   r-   r"   r   r"   r"   r#   r"   r"   r#   r#   r#   r#   r3   r$   )r$   r%   r4   r5   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   r7   )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"   rB   )r&   r$   )r   r   r   r"   r   r   r=   r8   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   r   )r"   r)   r/   r   r   )r   r#   r*   r0   r   )r   r   r$   r+   r1   )r   r   r   r%   r,   rA   r(   r&   )r   r   r(   r   r   )r.   r   r   r)   r   )r   r/   r   r   r*   rC   rD   rE   r"   r#   r$   )r%   r&   r(   )r%   r#   r   )r   r&   r$   )r"   rR   r"   )r"   r   r3   )rR   r"   r   )r   r"   rR   z%r %r %r %rshape)err_msg__len__)
r   rF   npr   r   diagsrG   hasattrlenmax)
rH   abcrI   rJ   rK   r[   rL   r\   r   r   r   
test_diagsN   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_   rG   r^   diagrH   rc   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_   rh   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||| qtttjd ggdg d S )Nr!   r'   r-   r   rN   r%   r$   r@   rW   r#   rA   rX   r"   )r%   r%   )r   rF   rj   rk   r   r_   	TypeError)rH   rc   rd   re   rI   rJ   rK   r[   r   r   r   test_diags_bad   s   ***z!TestConstructUtils.test_diags_badc                    s   t jd dD ]i}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rqt|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>   s     z9TestConstructUtils.test_diags_vs_diag.<locals>.<listcomp>c                 S   s   g | ]
\}}t ||qS r   )r^   rg   )rq   xjr   r   r   rt      s    )r^   r   ZseedZrandintZarangeZshuffler   r_   sumzipr   rG   ra   rg   )rH   Zn_diagsZoffsetsZ	diagonalsZmatZ	dense_matr   rs   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   rQ   )r[   r   r#   )r   r_   intr   r   rG   rH   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&   rm   r(   )listranger   r   r_   rG   )rH   rJ   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   r[   r{   r   r   r   test_diags_empty   s   
z#TestConstructUtils.test_diags_emptyc                 C      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 q5d S Nr"   r#   r   r$   Zint8r   )r   r   r   rT   rU   rV   )r   r   identityrG   r   r^   r   sparse_formatsrH   Ifmtr   r   r   test_identity       "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 ]8}d
D ]3}tddD ]+}t tj|||d tj|||d ||krt tj||d tj|||d qbq[qWd S )Nr"   r#   r$   rT   rU   r   rV   Zint16r   rS   rm   r(   )r   )r   r   eyerG   r   r^   r~   )rH   r   r   r   r   r   r   test_eye   s   "((&$zTestConstructUtils.test_eyec                 C   r   r   )r   r   r   rG   r   r^   r   r   r   r   r   r   test_eye_one   r   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 ]&}t||}tD ]}tjt|t||d}t|j| t	|
 | qqqd S )Nr   r3   r%   r,   r"   r#   r$   r&   r   r#   ir*   r   r1   r(   )r&   r%   r%   rT   )r(   r   r*   )r   r"   r   r#   r   r&   r*   )      ?g      ?r   g      
@)r   g      @r   r   r   )rF   r   r^   kronr   r   r
   r   r   r   rG   )rH   rI   rc   rd   expectedr   rL   r   r   r   	test_kron  s0     zTestConstructUtils.test_kronc                 C   sD   d}t d||d }t |dd| }t || t || d S )Ni   r"   )r   r   r   )rH   r   rc   rd   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 ])}tt|t| }ttt	||t|tt	| }t
|| qfqbd S )Nr   r3   r%   r,   r"   r#   r$   r&   r   r   )r   r$   r   rT   )r   r&   r3   )r%   rR   r*   )rF   r   r   Zkronsumr
   rG   r^   r   r   ra   r   )rH   rI   rc   rd   rL   r   r   r   r   test_kronsum$  s,     zTestConstructUtils.test_kronsumc                 C   sJ  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j|	 |	 gtjd}t|jtj t|j
jtj t|jjtj tt| | g | tj| | gtjd}t|jtj t|j
jtj t|jjtj d S )Nr"   r#   r$   r%   r&   r(   r   )r   r   r   r   ZvstackrG   r^   float32r   tocsrindicesint32indptrtocsc)rH   ABr   rL   r   r   r   test_vstack8  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 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hstackrG   r^   r   r   r   r   )rH   r   r   r   r   r   r   test_hstackR  s6   zTestConstructUtils.test_hstackc           	      C   sT  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dtjd}tt|	 |	 g||	 gg | tt|
 |
 g|
 |
 gg | tg dg dg dg}tt|d gd |gg | tt|	 |j	 g||	 gg | tt|
 |j
 g|
 |
 gg | tdtjd}tddgddgddgg}ttd |g|d gg | tt|j	 |	 g|	 |gg | tt|j
 |
 g|
 |
 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 sbw   Y  |d tt}t|	 g|	 gg W d    n	1 sw   Y  |d tt}t|
 g|
 gg W d    n	1 sw   Y  |d tt}t||gg W d    n	1 sw   Y  |d tt}t|	 |	 gg W d    n	1 sw   Y  |d tt}t|
 |
 gg W d    n	1 sw   Y  |d d S )Nr"   r#   r$   r%   r&   r(   r)   r   r   r   )r   r   r)   rP   r   )r"   r#   r   )r$   r%   r   rN   r   z.Got blocks\[1,0\]\.shape\[1\] == 1, expected 2z"incompatible dimensions for axis 1z+Mismatching dimensions along axis 1: {1, 2}z.Got blocks\[0,1\]\.shape\[0\] == 1, expected 2z+Mismatching dimensions along axis 0: {1, 2}z"incompatible dimensions for axis 0)r   r   r   r   ZbmatrG   r
   r^   r   r   r   Tr   emptyrj   rk   match)	rH   r   r   CDr   EZexcinfor   r   r   	test_bmatg  s    













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)rH   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_diagrG   )rH   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   rG   rH   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   rG   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 rY   )r"   r$   rZ   r%   r&   rP   )r"   r#   r$   r   r   )r   r   r   r%   r&   r"   r#   r$   )r$   r"   rO   r   N)r   r   r   r   rG   r   )rH   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              	      sH  t tfD ] tjtjtjtjtjtjtj	fD ]} 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  qed
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                          dddS )Nr&   r,   g?r   r   fr   r   <lambda>      z9TestConstructUtils.test_random_sampling.<locals>.<lambda>c                      r   )Nr&   r,   gr   r   r   r   r   r     r   )sprandr   r^   r   float64Z
longdoubler   r   Z	complex64Z
complex128r   r   r[   ZnnzZdoubler   RandomStater   datarowcolrz   Zprodr   rj   rk   )rH   tru   Zx1Zx2r   r   r   r   r   test_random_sampling  s2   
z'TestConstructUtils.test_random_samplingc                 C   s   d dt j g}zt j }|| W n	 ty   Y nw |D ]$}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_rngrF   AttributeErrorr   r   r   r   Z
less_equalr   rH   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w |D ]$}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   rF   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,   rJ   r   )r   r   r   r   r   r   test_random_accept_str_dtype3  s   z/TestConstructUtils.test_random_accept_str_dtypec                 C   s"   t jdddd}t| d d S )Nr,   gx&1?r   r0   )r   r   r   Zcount_nonzero)rH   Zsparse_matrixr   r   r   Etest_random_sparse_matrix_returns_correct_number_of_non_zero_elements8  s   zXTestConstructUtils.test_random_sparse_matrix_returns_correct_number_of_non_zero_elementsN)#__name__
__module____qualname__rM   rf   ri   rl   ro   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O
r    )r   r   NN)__doc__Znumpyr^   r   Znumpy.testingr   r   r   r   r   r   rj   Zscipy._lib._testutilsr   Zscipy._lib._utilr	   Zscipy.sparser
   r   r   r   Zscipy.sparse._constructr   r   Zscipy.sparse._sputilsr   r   r   r    r   r   r   r   <module>   s    
