U
    iâËdbw ã                   @   sÎ  d dl Z d dlZd dlmZmZ d dlZd dlZd dlmZm	Z	 d dl
Z
d dlZd dlmZmZmZ d dlmZ d dlmZmZmZmZmZmZ ddlmZ d dlZd	d
„ Zdd„ Zdd„ ZG dd„ deeƒZdd„ Z dd„ Z!dd„ Z"dd„ Z#dd„ Z$dd„ Z%dddd„Z&dd „ Z'ded"d#„Z(d$d%„ Z)dfd'd(„Z*d)d*„ Z+d+d,„ Z,dgd-d.„Z-dhd/d0„Z.did1d2„Z/d3d4„ Z0djd5d6„Z1d7d8„ Z2dkd9d:„Z3d;d<„ Z4G d=d>„ d>eeƒZ5G d?d@„ d@eƒZ6G dAdB„ dBe5ƒZ7G dCdD„ dDe5ƒZ8G dEdF„ dFe5ƒZ9G dGdH„ dHe5ƒZ:G dIdJ„ dJe5ƒZ;G dKdL„ dLe5ƒZ<G dMdN„ dNe<ƒZ=G dOdP„ dPe<ƒZ>G dQdR„ dRe5ƒZ?G dSdT„ dTe5ƒZ@G dUdV„ dVe<ƒZAG dWdX„ dXe5ƒZBG dYdZ„ dZe<ƒZCG d[d\„ d\e5ƒZDG d]d^„ d^e5ƒZEG d_d`„ d`e<ƒZFG dadb„ dbeƒZGeHdck�rÊe I¡  dS )lé    N)ÚproductÚcycle)ÚNumberÚIntegral)ÚjitÚnjitÚtypeof)Úerrors)ÚTestCaseÚtagÚneeds_lapackÚ
needs_blasÚ
_is_armv7lÚEnableNRTStatsMixiné   )Úmatmul_usecasec                 C   s   t  | |¡S ©N©ÚnpÚdot©ÚaÚb© r   úP/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/tests/test_linalg.pyÚdot2   s    r   c                 C   s   t j| ||d�S ©N©Úoutr   ©r   r   r   r   r   r   Údot3   s    r    c                 C   s   t  | |¡S r   )r   Úvdotr   r   r   r   r!      s    r!   c                       sö   e Zd ZdZejejejejfZ	‡ fdd„Z
dd„ Zdd„ Zejdd	„ ƒZd
d„ Zdd„ Zdd„ Zd,dd„Zd-dd„Zdd„ Zedd„ ƒZedd„ ƒZdd„ Zedd„ ƒZd d!„ Zed"d#„ ƒZed$d%„ ƒZed&d'„ ƒZed(d)„ ƒZed*d+„ ƒZ ‡  Z!S ).ÚTestProductz!
    Tests for dot products.
    c                    s   t  ¡  tt| ƒ ¡  d S r   )ÚgcÚcollectÚsuperr"   ÚsetUp©Úself©Ú	__class__r   r   r&   &   s    zTestProduct.setUpc                 C   s>   t  |¡}t|t jƒr(|d d  |¡S |d d  |¡S d S ©Ny      ð?      à¿y               @g      à?r   ©r   ÚarangeÚ
issubclassZcomplexfloatingÚastype©r(   ÚnÚdtypeÚbaser   r   r   Úsample_vector+   s    
zTestProduct.sample_vectorc                 C   s   |   || |¡ ||f¡S r   )r4   Úreshape)r(   Úmr1   r2   r   r   r   Úsample_matrix4   s    zTestProduct.sample_matrixc              	   c   sš   t jdd��}t  dtj¡ dV  W 5 Q R X |  t|ƒd¡ |  |d jtj¡ |  	dt
|d jƒ¡ |  |d j|jj¡ |  |d j|jjd ¡ dS )zB
        Check performance warning(s) for non-contiguity.
        T)ÚrecordÚalwaysNr   r   zfaster on contiguous arrays)ÚwarningsÚcatch_warningsÚsimplefilterr	   ZNumbaPerformanceWarningZassertGreaterEqualÚlenÚassertIsÚcategoryÚassertInÚstrÚmessageÚassertEqualÚfilenameÚ__code__Úco_filenameÚlinenoÚco_firstlineno)r(   ÚpyfuncÚwr   r   r   Úcheck_contiguity_warning7   s    z$TestProduct.check_contiguity_warningc              	   C   s<   |   ¡ �* ||Ž }||Ž }| j||dd� ~~W 5 Q R X d S )NT©Zignore_sign_on_zero)ÚassertNoNRTLeakÚassertPreciseEqual)r(   rI   ÚcfuncÚargsÚexpectedÚgotr   r   r   Ú
check_funcF   s
    
zTestProduct.check_funcc                 C   sÄ   |j d |j d }|j |j }tj|tjd�}t|jd ƒD ]*}|||| … j|jd�}|jj	r> qrq>t
dƒ‚|jjrŽtj||jdd�}ntj||jdd�}|d d … |d d …< |jj	sÀt‚|S )Nr   ©r2   zCould not obtain aligned arrayÚC©ÚorderÚF)ÚsizeÚitemsizer   ÚemptyZuint8ÚrangeÚviewr2   ÚflagsZalignedÚ	ExceptionÚc_contiguousr5   ÚshapeÚAssertionError)r(   ZarrrY   ZdatasizeÚtmpÚiÚnewr   r   r   Ú_aligned_copyN   s    zTestProduct._aligned_copyc              	   C   sx   t r
| jntj}|  ¡ �V ||ƒ}||ƒ}|  ||d|iŽ|¡ |  ||d|iŽ|¡ | j||dd� ~~W 5 Q R X d S )Nr   TrL   )r   rf   r   ÚcopyrM   r>   rN   )r(   rI   rO   rP   r   ÚcopierrQ   rR   r   r   r   Úcheck_func_outc   s    
zTestProduct.check_func_outFc              	   C   s@   |   t¡�}||Ž  W 5 Q R X |r&dnd}|  |t|jƒ¡ d S )Nzincompatible output array sizezincompatible array sizes)ÚassertRaisesÚ
ValueErrorr@   rA   Ú	exception)r(   rO   rP   Úis_outÚraisesÚmsgr   r   r   Úassert_mismatching_sizesm   s    ÿz$TestProduct.assert_mismatching_sizesúnp.dot()c              	   C   s<   |   tj¡�}||Ž  W 5 Q R X |  d|f t|jƒ¡ d S )Nz)%s arguments must all have the same dtype)rj   r	   ÚTypingErrorr@   rA   rl   )r(   rO   rP   Ú	func_namern   r   r   r   Úassert_mismatching_dtypest   s    ÿþz%TestProduct.assert_mismatching_dtypesc              
   C   sÒ   d}t dd�|ƒ}| jD ]T}|  ||¡}|  ||¡}|  ||||f¡ |  |||d d d… |d d d… f¡ q|  |d tj¡}|  |tj¡}|  |||f¡ |  |tj¡}|  |tj¡}| j|||f|d� d S )Né   T©Znopythonéÿÿÿÿr   )rs   )	r   Údtypesr4   rS   r   Úfloat64rp   Úfloat32rt   )r(   rI   rs   r1   rO   r2   r   r   r   r   r   Úcheck_dot_vv{   s    
(zTestProduct.check_dot_vvc                 C   s   |   td¡ dS )z/
        Test vector * vector np.dot()
        rq   N)r{   r   r'   r   r   r   Útest_dot_vvŽ   s    zTestProduct.test_dot_vvc                 C   s   |   td¡ dS )z 
        Test np.vdot()
        z	np.vdot()N)r{   r!   r'   r   r   r   Ú	test_vdot•   s    zTestProduct.test_vdotc                    s4  ‡ fdd„}t dd�|ƒ}|d k	r0t dd�|ƒ}dD ]˜\}}|||ƒD ].\}	}
ˆ  |||	|
f¡ ˆ  |||
|	jf¡ qF|d k	r4|||ƒD ]B\}	}
tj||	jd�}ˆ  |||	|
f|¡ ˆ  |||
|	jf|¡ qˆq4d\}}ˆ  ||d tj¡}	ˆ  	|tj¡}
ˆ  
||	|
f¡ ˆ  
||
|	jf¡ |d k	�r¶t |tj¡}ˆ  
||	|
|f¡ ˆ  
||
|	j|f¡ ˆ  ||tj¡}	ˆ  	|tj¡}
t |d tj¡}ˆ j
||	|
|fdd	� ˆ j
||
|	j|fdd	� ˆ  ||tj¡}	ˆ  	|tj¡}
ˆ  ||	|
f|¡ |d k	�r0ˆ  ||tj¡}	ˆ  	|tj¡}
t |tj¡}ˆ  ||	|
|f|¡ d S )
Nc                 3   sŒ   dD ]4}ˆ   | |tj¡j|d�}ˆ  |tj¡}||fV  qˆ jD ](}ˆ   | ||¡}ˆ  ||¡}||fV  q@|d d d… |d d d… fV  d S ©NÚCFrV   rw   )r7   r   ry   rg   r4   rx   )r6   r1   rW   r   r   r2   r'   r   r   Úsamplesž   s    
z)TestProduct.check_dot_vm.<locals>.samplesTrv   )©é   ru   )ru   r   )r   ru   rT   r�   r   ©rm   )r   rS   ÚTr   r[   r2   ri   r7   ry   r4   rp   rz   rt   )r(   Úpyfunc2Úpyfunc3rs   r€   Úcfunc2Úcfunc3r6   r1   r   r   r   r   r'   r   Úcheck_dot_vmœ   sF    

zTestProduct.check_dot_vmc                 C   s   |   ttd¡ dS )zC
        Test vector * matrix and matrix * vector np.dot()
        rq   N)r‰   r   r    r'   r   r   r   Útest_dot_vmÔ   s    zTestProduct.test_dot_vmc                    s.  ‡ fdd„}t dd�|ƒ}|d k	r0t dd�|ƒ}dD ]º\}}}	||||	ƒD ]0\}
}ˆ  |||
|f¡ ˆ  |||j|
jf¡ qJ|d k	r4||||	ƒD ]\\}
}tj||f|
jd�}ˆ  |||
|f|¡ tj||f|
jd�}ˆ  |||j|
jf|¡ q�q4d\}}}	ˆ  ||	d tj¡}
ˆ  |	|tj¡}ˆ  	||
|f¡ |d k	�r¨t ||ftj¡}ˆ  	||
||f¡ ˆ  ||	tj¡}
ˆ  |	|tj¡}t ||d ftj¡}ˆ j	||
||fdd	� ˆ  ||	tj
¡}
ˆ  |	|tj¡}ˆ  ||
|f|¡ |d k	�r*ˆ  ||	tj¡}
ˆ  |	|tj¡}t ||ftj
¡}ˆ  ||
||f|¡ d S )
Nc                 3   s¢   t ddƒD ]B\}}ˆ  | |tj¡j|d�}ˆ  ||tj¡j|d�}||fV  q
ˆ jD ]*}ˆ  | ||¡}ˆ  |||¡}||fV  qT|d d d… |d d d… fV  d S r~   )r   r7   r   ry   rg   rx   )r6   r1   ÚkZorder_aZorder_br   r   r2   r'   r   r   r€   Ý   s    
z)TestProduct.check_dot_mm.<locals>.samplesTrv   )©r‚   ru   é   )r   ru   r�   )r   r   r�   )r   ru   r‚   )ru   r   r‚   )r   r   ru   )ru   r‚   r   rT   rŒ   r   rƒ   )r   rS   r„   r   r[   r2   ri   r7   ry   rp   rz   rt   )r(   r…   r†   rs   r€   r‡   rˆ   r6   r1   r‹   r   r   r   r   r'   r   Úcheck_dot_mmÛ   sB    


zTestProduct.check_dot_mmc                 C   s   |   ttd¡ dS )z/
        Test matrix * matrix np.dot()
        rq   N)rŽ   r   r    r'   r   r   r   Útest_dot_mm  s    zTestProduct.test_dot_mmc                 C   s   |   td¡ dS )z&
        Test vector @ vector
        ú'@'N)r{   r   r'   r   r   r   Útest_matmul_vv   s    zTestProduct.test_matmul_vvc                 C   s   |   tdd¡ dS )z:
        Test vector @ matrix and matrix @ vector
        Nr�   )r‰   r   r'   r   r   r   Útest_matmul_vm'  s    zTestProduct.test_matmul_vmc                 C   s   |   tdd¡ dS )z&
        Test matrix @ matrix
        Nr�   )rŽ   r   r'   r   r   r   Útest_matmul_mm.  s    zTestProduct.test_matmul_mmc           	   	   C   s  d\}}}t j}|  |||¡d d d… }|  |||¡d d d… }t  ||f|¡}tdd�tƒ}|  |j¡� |||ƒ W 5 Q R X tdd�tƒ}|  |j¡� ||||ƒ W 5 Q R X |  	||¡d d d… }|  	||¡d d d… }tdd�t
ƒ}|  |j¡� |||ƒ W 5 Q R X d S )NrŒ   rw   Trv   )r   ry   r7   r[   r   r   rK   Úpy_funcr    r4   r!   )	r(   r6   r‹   r1   r2   r   r   r   rO   r   r   r   Útest_contiguity_warnings5  s     
z$TestProduct.test_contiguity_warnings)F)rq   )"Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ry   rz   Ú
complex128Ú	complex64rx   r&   r4   r7   Ú
contextlibÚcontextmanagerrK   rS   rf   ri   rp   rt   r{   r   r|   r}   r‰   rŠ   rŽ   r�   r‘   r’   r“   r•   Ú__classcell__r   r   r)   r   r"      s>   	





8
>



r"   c                 C   s   t j | ¡S r   ©r   ÚlinalgÚinv©r   r   r   r   Úinvert_matrixN  s    r£   c                 C   s   t j | ¡S r   )r   r    Úcholeskyr¢   r   r   r   Úcholesky_matrixR  s    r¥   c                 C   s   t j | ¡S r   )r   r    Úeigr¢   r   r   r   Ú
eig_matrixV  s    r§   c                 C   s   t j | ¡S r   )r   r    Úeigvalsr¢   r   r   r   Úeigvals_matrixZ  s    r©   c                 C   s   t j | ¡S r   )r   r    Úeighr¢   r   r   r   Úeigh_matrix^  s    r«   c                 C   s   t j | ¡S r   )r   r    Úeigvalshr¢   r   r   r   Úeigvalsh_matrixb  s    r­   c                 C   s   t j | |¡S r   ©r   r    Úsvd)r   Úfull_matricesr   r   r   Ú
svd_matrixf  s    r±   c                 C   s   t j | ¡S r   ©r   r    Úqrr¢   r   r   r   Ú	qr_matrixj  s    r´   rw   c                 C   s   t j | ||¡S r   ©r   r    Úlstsq)ÚAÚBÚrcondr   r   r   Úlstsq_systemn  s    rº   c                 C   s   t j | |¡S r   ©r   r    Úsolve)r·   r¸   r   r   r   Úsolve_systemr  s    r½   çVçž¯Ò<c                 C   s   t j | ¡S r   ©r   r    Úpinv)r·   r¹   r   r   r   Úpinv_matrixv  s    rÁ   c                 C   s   t j | ¡S r   ©r   r    Úslogdetr¢   r   r   r   Úslogdet_matrixz  s    rÄ   c                 C   s   t j | ¡S r   )r   r    Údetr¢   r   r   r   Ú
det_matrix~  s    rÆ   c                 C   s   t j | |¡S r   )r   r    Únorm)r   Úordr   r   r   Únorm_matrix‚  s    rÉ   c                 C   s   t j | |¡S r   )r   r    Úcond)r   Úpr   r   r   Úcond_matrix†  s    rÌ   c                 C   s   t j | |¡S r   ©r   r    Úmatrix_rank)r   Útolr   r   r   Úmatrix_rank_matrixŠ  s    rÐ   c                 C   s   t j | |¡S r   )r   r    Úmatrix_power)r   r1   r   r   r   Úmatrix_power_matrixŽ  s    rÒ   c                 C   s   t  | |¡S r   ©r   Útrace)r   Úoffsetr   r   r   Útrace_matrix’  s    rÖ   c                 C   s
   t  | ¡S r   rÓ   r¢   r   r   r   Útrace_matrix_no_offset–  s    r×   c                 C   s   t j| ||d�S r   )r   Úouterr   r   r   r   Úouter_matrixš  s    rÙ   c                 C   s   t  | |¡S r   )r   Úkronr   r   r   r   Úkron_matrixž  s    rÛ   c                       sž   e Zd ZdZejejejejfZ	‡ fdd„Z
dd„ Zddd„Zefd	d
„Zdd„ Zdd„ Zddd„Zdd„ Zdd„ Zdd„ Zd dd„Zdd„ Zdd„ Z‡  ZS )!ÚTestLinalgBasezU
    Provides setUp and common data/error modes for testing np.linalg functions.
    c                    s   t  ¡  tt| ƒ ¡  d S r   )r#   r$   r%   rÜ   r&   r'   r)   r   r   r&   ª  s    zTestLinalgBase.setUpc                 C   s>   t  |¡}t|t jƒr(|d d  |¡S |d d  |¡S d S r+   r,   r0   r   r   r   r4   ¯  s    
zTestLinalgBase.sample_vectorNc                 C   s  d}t |ƒdkrtdƒ‚|dkr(tdƒ‚|tjtjtjtjfkrHtdƒ‚|dk	r`|dk	r`tdƒ‚|dkrl|}|d	k r|td
ƒ‚tj d¡ |\}}|dk s |dk r¨tdƒ‚t	||ƒ}	|dkrÀ|	}
n6|dkrÐtdƒ‚t
|tƒsâtdƒ‚|}
||	krötdƒ‚|d	k�s
|d	k�r<||k�rtdƒ‚t||ƒ}|  ||¡ ||¡}nÒ|  || |¡ ||¡}tj |¡\}}|  || |¡ddd…  ||¡}tj |¡\}}t |||
¡}t ||f¡}t t ||¡¡}|||d d|
… |d	 d|
… f< t t ||¡|j¡}tj|||d�}|S )a÷  
        Provides a sample matrix with an optionally specified rank or condition
        number.

        size: (rows, columns), the dimensions of the returned matrix.
        dtype: the dtype for the returned matrix.
        order: the memory layout for the returned matrix, 'F' or 'C'.
        rank: the rank of the matrix, an integer value, defaults to full rank.
        condition: the condition number of the matrix (defaults to 1.)

        NOTE: Only one of rank or condition may be set.
        ç      ð?r‚   úsize must be a length 2 tuple.)rX   rU   ú order must be one of 'F' or 'C'.ú*dtype must be a numpy floating point type.Nú/Only one of rank or condition can be specified.r   úCondition number must be >=1.r   ú+Negative dimensions given for matrix shape.úRank must be greater than zero.úRank must an integer.ú"Rank given greater than full rank.ú8Condition number was specified for a vector (always 1.).rw   ©r2   rW   )r=   rk   r   rz   ry   r›   rš   ÚrandomÚseedÚminÚ
isinstancer   Úmaxr4   r5   r    r³   ZlinspaceÚzerosÚnonzeroÚeyer   r„   Úarray)r(   rY   r2   rW   ÚrankÚ	conditionZd_condr6   r1   ÚminmnÚrvZmaxmnÚQrc   ÚUÚ_ÚVÚsvÚSÚidxr   r   r   Úspecific_sample_matrix¸  sZ    


ÿ
"$z%TestLinalgBase.specific_sample_matrixc              	   C   s4   |   |¡�}||Ž  W 5 Q R X |  |t|jƒ¡ d S r   )rj   r@   rA   rl   )r(   rO   rP   ro   Úerrrn   r   r   r   Úassert_error  s    zTestLinalgBase.assert_errorc                 C   s   d}|   |||tjj¡ d S )Nz.Last 2 dimensions of the array must be square.©rÿ   r   r    ZLinAlgError©r(   rO   rP   ro   r   r   r   Úassert_non_square  s    z TestLinalgBase.assert_non_squarec                 C   s   d| }|   |||tj¡ d S )Nz9np.linalg.%s() only supported on float and complex arrays©rÿ   r	   rr   ©r(   ÚnamerO   rP   ro   r   r   r   Úassert_wrong_dtype  s    z!TestLinalgBase.assert_wrong_dtypeTc                 C   s.   |rdnd}d||f }|   |||tj¡ d S )Nú	np.linalgr   z$%s.%s() only supported on 2-D arraysr  ©r(   r  rO   rP   Z	la_prefixÚprefixro   r   r   r   Úassert_wrong_dimensions  s    z&TestLinalgBase.assert_wrong_dimensionsc                 C   s   d}|   |||tjj¡ d S )Nz$Array must not contain infs or NaNs.r   r  r   r   r   Úassert_no_nan_or_inf  s    z#TestLinalgBase.assert_no_nan_or_infc                 C   sŒ   t |tƒr"|D ]}|  ||¡ qnft |tƒsˆ|jj}|jj}d}|  ||B |¡ d}|dkrj|  ||¡ n|dkr€|  ||¡ ntdƒ‚dS )a6  
        This checks that in a computed result from numba (array, possibly tuple
        of arrays) all the arrays are contiguous in memory and that they are
        all at least one of "C_CONTIGUOUS" or "F_CONTIGUOUS". The computed
        result of the contiguousness is then compared against a hardcoded
        expected result.

        got: is the computed results from numba
        expected_contig: is "C" or "F" and is the expected type of
                        contiguousness across all input values
                        (and therefore tests).
        z6Results are not at least one of all C or F contiguous.z0Computed contiguousness does not match expected.rU   rX   zUnknown contigN)	rì   ÚtupleÚassert_contig_sanityr   r^   r`   Úf_contiguousÚ
assertTruerk   )r(   rR   Zexpected_contigr   Zc_contigZf_contigro   r   r   r   r  "  s    

z#TestLinalgBase.assert_contig_sanityc                 C   s   d}| j |||tjjd� d S )Nz(Matrix is singular to machine precision.©rþ   r   r  r   r   r   Úassert_raise_on_singularG  s    z'TestLinalgBase.assert_raise_on_singularc                 C   sv   |   |jd |jd ¡ tj|jd |jd�}dt |j¡j }|dkrPd| }|dkr`d| }tj ||||¡ dS )zE
        Checks if a matrix is equal to the identity matrix.
        rw   éþÿÿÿrT   é   Né
   éd   )	rC   ra   r   rð   r2   ÚfinfoÚ
resolutionÚtestingÚassert_allclose)r(   rR   ÚrtolÚatolrð   r  r   r   r   Úassert_is_identity_matrixK  s    z(TestLinalgBase.assert_is_identity_matrixc                 C   s   d}|   |||t¡ dS )z5
        For use in norm() and cond() tests.
        z Invalid norm order for matrices.N)rÿ   rk   r  r   r   r   Úassert_invalid_norm_kind[  s    z'TestLinalgBase.assert_invalid_norm_kindc                 C   s   d}|   |||tjj¡ d S )NzArrays cannot be emptyr   r  r   r   r   Úassert_raise_on_emptyb  s    z$TestLinalgBase.assert_raise_on_empty)NN)T)NN)r–   r—   r˜   r™   r   ry   rz   rš   r›   rx   r&   r4   rý   rk   rÿ   r  r  r
  r  r  r  r  r  r  rž   r   r   r)   r   rÜ   ¢  s"   
   ÿ
T
%
rÜ   c                   @   s   e Zd ZdZdd„ ZdS )ÚTestTestLinalgBasez†
    The sample matrix code TestLinalgBase.specific_sample_matrix()
    is a bit involved, this class tests it works as intended.
    c              	      s¤  t dƒ‰ dddddg}t|ˆ jdƒD �] \}}}|\}}t||ƒ}ˆ  |||¡}ˆ |j|¡ ˆ tj 	|¡|¡ |dkr¶|d }	ˆ j||||	d	�}ˆ |j|¡ ˆ tj 	|¡|	¡ d
t 
|¡j }
ˆ  |||¡}ˆ |j|¡ tjjtj |¡d|
|
d� |dkr$d}ˆ j||||d�}ˆ |j|¡ tjjtj |¡d|
|
d� q$tf‡ ‡fdd„	}ˆ t¡� }d}|dtjdf|td� W 5 Q R X d}|dtjdf|td� d}|dtjdf|td� d}|dtjdf|td� d}|dtjdddf|td� d}|dtjdd df|td� d}|dtjdf|td� d}|dtjddf|td� d }|dtjdd!f|td� d"}|d#tjdd d$f|td� d%}|dtjdd&f|td� d S )'Nrý   ©é   r   ©é   r  ©r  r#  ©ru   ru   ©r   r!  ÚFCr   ©rò   r  rÝ   ©r  r  ç      $@©ró   c              	      s6   ˆ  |¡�}ˆ j| Ž  W 5 Q R X ˆ |t|jƒ¡ d S r   )rj   rý   r@   rA   rl   )rP   ro   rþ   rn   ©Úinstr(   r   r   Úcheck_errorœ  s    zCTestTestLinalgBase.test_specific_sample_matrix.<locals>.check_errorÚblankr�   rX   r  rÞ   ©r   rß   Úzrà   rá   râ   rw   rã   )r‚   éýÿÿÿrä   ræ   r�   rç   )r   ru   r  rå   g      ø?)rÜ   r   rx   rë   rý   rC   ra   r   r    rÎ   r  r  r  r  rÊ   rk   rj   rb   ry   Úint32)r(   ÚsizesrY   r2   rW   r6   r1   rô   r·   rò   r  ró   r.  rn   ro   r   r,  r   Útest_specific_sample_matrixm  sv    
ý   ÿý z.TestTestLinalgBase.test_specific_sample_matrixN)r–   r—   r˜   r™   r5  r   r   r   r   r  g  s   r  c                   @   s(   e Zd ZdZedd„ ƒZedd„ ƒZdS )ÚTestLinalgInvz"
    Tests for np.linalg.inv.
    c                    s¼   d}t dd�tƒ‰ ‡ ‡fdd„}tˆjdƒD ]"\}}ˆ ||f||¡}||ƒ q,|t d¡ƒ ˆ ˆ t d¡f¡ ˆ 	d	ˆ tjd
tj
d�f¡ ˆ d	ˆ t d¡f¡ ˆ ˆ t d
¡f¡ dS )z$
        Test np.linalg.inv
        r  Trv   c              	      sŠ   t | ƒ}ˆ | ƒ}ˆ |d¡ d}ztjj||dd� W n tk
rN   d}Y nX |rjt || ¡}ˆ |¡ ˆ ¡ � ˆ | ƒ W 5 Q R X d S )NrX   Fr  ©ZnulpT)	r£   r  r   r  Úassert_array_almost_equal_nulprb   r   r  rM   )r   ÚkwargsrQ   rR   Úuse_reconstructionÚrec©rO   r(   r   r   ÚcheckÞ  s    
ÿ



z,TestLinalgInv.test_linalg_inv.<locals>.checkr   ©r   r   r�   r¡   ©r‚   r‚   rT   N)r   r£   r   rx   rý   r   r[   r  Úonesr  r3  r
  r  rî   )r(   r1   r=  r2   rW   r   r   r<  r   Útest_linalg_invÖ  s    
ÿzTestLinalgInv.test_linalg_invc                 C   s–   t jddddgddddgddd	d	gdd
ddggdd�}t  |¡}tdd�dd„ ƒ}| |d¡}t j ||¡ ||dƒ}t j ||¡ t j ||¡ d S )NrÝ   ru   r‚   r!  éûÿÿÿr�   é	   r2  r   r  é   rX   rV   Trv   c                 S   s$   |r| dd…d d …f } t j | ¡S ©Nr   r‚   rŸ   ©ÚXÚtestr   r   r   Úainv  s    z2TestLinalgInv.test_no_input_mutation.<locals>.ainvF©r   rñ   rg   r   r”   r  r  )r(   rG  ÚX_origrI  rQ   rR   r   r   r   Útest_no_input_mutation	  s    


ýý


z$TestLinalgInv.test_no_input_mutationN)r–   r—   r˜   r™   r   rA  rL  r   r   r   r   r6  Ñ  s
   
2r6  c                   @   s,   e Zd ZdZdd„ Zdd„ Zedd„ ƒZdS )	ÚTestLinalgCholeskyz'
    Tests for np.linalg.cholesky.
    c           	      C   sj   t j d¡ t j ||¡}t j |¡\}}t  d|d ¡}t  t  |jt  	|¡¡|¡}t j
|||d�}|S )Nr   r   rè   )r   ré   rê   Úrandr    r³   r-   r   r„   Údiagrñ   )	r(   r6   r2   rW   r·   Úqrø   ÚLrö   r   r   r   r7   '  s    z TestLinalgCholesky.sample_matrixc                 C   s   d}|   |||tjj¡ d S )Nz Matrix is not positive definite.r   r  r   r   r   Úassert_not_pd3  s    z TestLinalgCholesky.assert_not_pdc                    sÖ   d}t dd�tƒ‰ ‡ ‡fdd„}tˆjdƒD ]\}}ˆ |||¡}||ƒ q,|t d¡ƒ d}ˆ ˆ tjd	tj	d
�f¡ ˆ 
|ˆ tjdtjd
�f¡ ˆ |ˆ tjdtj	d
�f¡ ˆ ˆ tjdtj	d
� dd¡f¡ dS )z)
        Test np.linalg.cholesky
        r  Trv   c              	      s®   t | ƒ}ˆ | ƒ}d}ˆ |d¡ ztjj||dd� W n tk
rN   d}Y nX |rŽt |t |j¡¡}dt 	| j
¡j }tjj| |||d� ˆ ¡ � ˆ | ƒ W 5 Q R X d S )NFrU   r  r7  Tr  r)  )r¥   r  r   r  r8  rb   r   Úconjr„   r  r2   r  r  rM   )r   rQ   rR   r:  r;  r  r<  r   r   r=  ?  s*    
ÿ

ü
z6TestLinalgCholesky.test_linalg_cholesky.<locals>.checkr'  r>  r¤   r�   rT   r?  r�   r‚   N)r   r¥   r   rx   r7   r   r[   r  r@  ry   r  r3  r
  rR  r5   )r(   r1   r=  r2   rW   r   Úrnr   r<  r   Útest_linalg_cholesky7  s$    
ÿÿÿz'TestLinalgCholesky.test_linalg_choleskyN)r–   r—   r˜   r™   r7   rR  r   rU  r   r   r   r   rM  "  s
   rM  c                   @   sn   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	d
„Zedd„ ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZedd„ ƒZdS )ÚTestLinalgEigenSystemsz*
    Tests for np.linalg.eig/eigvals.
    c                 C   sŠ   |   ||¡}t |¡}t t |jd |jd d¡¡}|dd … ||< t t |jd |jd d¡¡}|d d… ||< tj|||d�}|S )Nr   r   rw   rè   )r4   r   rO  rï   rð   ra   rñ   )r(   r6   r2   rW   Úvrö   rü   r   r   r   r7   z  s    
  z$TestLinalgEigenSystems.sample_matrixc                 C   s   |d }|   |||¡ d S )Nz+() argument must not cause a domain change.)rÿ   r  r   r   r   Úassert_no_domain_change…  s    z.TestLinalgEigenSystems.assert_no_domain_changec                    s   ‡ ‡‡‡fdd„}|S )Nc               	      s  ˆ j | Ž }ˆ | Ž }| d }ˆ t|ƒt|ƒ¡ d}t|tƒrRd}ˆ t|ƒˆ¡ nˆ |jˆ¡ ˆ |d¡ d}tt|ƒƒD ]<}ztj	j
|| || dd� W q| tk
r¶   d}Y q|X q|dt |j¡j }|�rä|�rÄ|\}}	ˆd d	k�rht t |jd |jd
 d¡¡}
t t |jd |jd
 d
¡¡}ˆ | Ž  t ||
 ¡||< t t |¡¡|t |jd ¡< t ||	¡}t |	t |¡¡}tj	j|j|j||d� t |	¡�rätj	j|j|j||d� n tj	jt |¡t |¡||d� ˆ ¡ � ˆ | Ž  W 5 Q R X d S )Nr   FTrX   r  r7  r  rw   Úhr   r)  )r”   rC   r=   rì   r  Úndimr  r\   r   r  r8  rb   r  r2   r  rï   rð   ra   rS  ÚrealrO  Zdiag_indicesr   r  ÚiscomplexobjÚimagÚsortrM   )rP   rQ   rR   r   Zres_is_tupler:  r‹   r  rJ   rW  ZidxlZidxuÚlhsÚrhs©rO   Úexpected_res_lenr  r(   r   r   r=  ‹  sj    

  ÿ
   üüü
z3TestLinalgEigenSystems._check_worker.<locals>.checkr   )r(   rO   r  rb  Úcheck_for_domain_changer=  r   ra  r   Ú_check_worker‰  s    \z$TestLinalgEigenSystems._check_workerNc              	   C   s`  d}t dd�|ƒ}|  ||||¡}t| jdƒD ]\}}	|  |||	¡}
||
ƒ q.tjtjfD ]Œ}|tjd|d�ƒ |  	|tj
d|d�f¡ |  ||tj
dtjd�f¡ |  ||tj
d|d�f¡ |  |tjd	d
gtjtjgg|d�f¡ qZ|�r\t ddgddgg¡}|| tj¡ƒ ||ƒ\}}|  t |j¡¡ tjtjfD ]}|  ||| |¡f¡ �q>dS )z$
        Test np.linalg.eig
        r  Trv   r'  r>  rT   r�   r?  rÝ   ç       @r   r  r‚   N)r   rd  r   rx   r7   r   rz   r›   r[   r  r@  r  r3  r
  r  rñ   ÚinfÚnanr/   rš   r  Úanyr]  ry   rX  )r(   r  Úfuncrb  rc  r1   rO   r=  r2   rW   r   Útyr·   Úlrø   r   r   r   Úchecker_for_linalg_eigé  s6    
ÿ
ÿÿÿz-TestLinalgEigenSystems.checker_for_linalg_eigc                 C   s   |   dtdd¡ d S )Nr¦   r‚   T)rl  r§   r'   r   r   r   Útest_linalg_eig'  s    z&TestLinalgEigenSystems.test_linalg_eigc                 C   s   |   dtdd¡ d S )Nr¨   r   T)rl  r©   r'   r   r   r   Útest_linalg_eigvals+  s    z*TestLinalgEigenSystems.test_linalg_eigvalsc                 C   s   |   dtdd¡ d S )Nrª   r‚   F)rl  r«   r'   r   r   r   Útest_linalg_eigh/  s    z'TestLinalgEigenSystems.test_linalg_eighc                 C   s   |   dtdd¡ d S )Nr¬   r   F)rl  r­   r'   r   r   r   Útest_linalg_eigvalsh3  s    z+TestLinalgEigenSystems.test_linalg_eigvalshc                    sô   dD ]ê}|\}}}t tj|ƒ‰ tdd�‡ fdd„ƒ}|  ||||¡}tjtjfD ]œ}| jˆ |d��„ tjddd	dgdd
d	d	gd	d	dd	gdd	d	dggd|d�}t 	|¡}	| 
|d¡}
tj ||	¡ ||dƒ}tj ||	¡ ||dƒ W 5 Q R X qPqd S )N))r¦   r‚   T)r¨   r   T)rª   r‚   F)r¬   r   FTrv   c                    s    |r| dd…d d …f } ˆ | ƒS rE  r   rF  ©Úmethr   r   ri  D  s    z;TestLinalgEigenSystems.test_no_input_mutation.<locals>.func)rr  r2   r*  r   r   rC  rD  r!  rX   )rW   r2   F)Úgetattrr   r    r   rd  ry   rš   ZsubTestrñ   rg   r”   r  r  )r(   Úcr6   ZnoutZdomain_changeri  r=  r2   rG  rK  rQ   rR   r   rq  r   rL  7  s,    



ý ü

z-TestLinalgEigenSystems.test_no_input_mutation)N)r–   r—   r˜   r™   r7   rX  rd  rl  r   rm  rn  ro  rp  rL  r   r   r   r   rV  u  s    a ÿ
>



rV  c                   @   s0   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZdS )	ÚTestLinalgSvdz"
    Tests for np.linalg.svd.
    c                 C   sœ   |\}}}t t|ƒƒD ]}|  || j|| j¡ qt |jd |jd f¡}t ||¡ t t ||¡|¡}	t |j	¡j
}
tjj||	d|
 d|
 d� d S )Nr   r   r  r  r)  )r\   r=   rC   ra   r   rî   Zfill_diagonalr   r  r2   r  r  r  )r(   r   rR   rQ   Úurú   Úvtr‹   Úsr;  r  r   r   r   Úcheck_reconstructionm  s    
üz"TestLinalgSvd.check_reconstructionc                    sô   t dd�tƒ‰ ‡ ‡fdd„}ddddd	g}d
}t|ˆj|dƒD ]&\}}}}ˆ |||¡}|||d� q>d}	ˆ |	ˆ tjdtjd�f¡ ˆ 	|	ˆ tjdtj
d�f¡ ˆ ˆ tjddgtjtjggtj
d�f¡ dD ]}
t |
¡df}ˆ ˆ |¡ qÐdS )z$
        Test np.linalg.svd
        Trv   c              	      sÌ   t | f|Ž}ˆ | f|Ž}ˆ t|ƒt|ƒ¡ ˆ t|ƒd¡ ˆ |d¡ d}tt|ƒƒD ]<}ztjj|| || dd� W qX tk
r’   d}Y qXX qX|r¨ˆ 	| ||¡ ˆ 
¡ � ˆ | f|Ž W 5 Q R X d S )Nru   rX   Fr  r7  T)r±   rC   r=   r  r\   r   r  r8  rb   ry  rM   )r   r9  rQ   rR   r:  r‹   r<  r   r   r=  ˆ  s&      ÿ

z,TestLinalgSvd.test_linalg_svd.<locals>.checkr   )r!  r  )r  r!  r%  r&  )TFr'  )r°   r¯   r?  rT   r  rÝ   re  ©©r   r   ©r   r   r>  N)r   r±   r   rx   rý   r  r   r@  r3  r
  ry   r  rñ   rf  rg  r[   r  )r(   r=  r4  r°   rY   r2   ZfmatrW   r   rT  ÚszrP   r   r<  r   Útest_linalg_svd�  s.    ÿÿÿÿÿzTestLinalgSvd.test_linalg_svdc                 C   sÒ   t jddddgddddgddd	d	gdd
ddggdd�}t  |¡}tdd�dd„ ƒ}| |d¡}t j ||¡ ||dƒ}t j ||¡ z&t||ƒD ]\}}t j ||¡ q�W n" tk
rÌ   |  	|||¡ Y nX d S )NrÝ   ru   r‚   r!  rB  r�   rC  r2  r   r  rD  rX   rV   Trv   c                 S   s$   |r| dd…d d …f } t j | ¡S rE  r®   rF  r   r   r   ri  Î  s    z2TestLinalgSvd.test_no_input_mutation.<locals>.funcF)
r   rñ   rg   r   r”   r  r  Úziprb   ry  ©r(   rG  rK  ri  rQ   rR   Ze_aZg_ar   r   r   rL  Å  s&    


ýý


z$TestLinalgSvd.test_no_input_mutationN)r–   r—   r˜   r™   ry  r   r~  rL  r   r   r   r   ru  b  s   

Cru  c                   @   s(   e Zd ZdZedd„ ƒZedd„ ƒZdS )ÚTestLinalgQrz!
    Tests for np.linalg.qr.
    c           	         sâ   t dd�tƒ‰ ‡ ‡fdd„}ddddd	g}t|ˆjd
ƒD ] \}}}ˆ |||¡}||ƒ q8d}ˆ |ˆ tjdtjd�f¡ ˆ 	|ˆ tjdtj
d�f¡ ˆ ˆ tjddgtjtjggtj
d�f¡ dD ]}ˆ ˆ t |¡f¡ qÄdS )z#
        Test np.linalg.qr
        Trv   c           
   	      sB  t | f|Ž}ˆ | f|Ž}ˆ t|ƒt|ƒ¡ ˆ t|ƒd¡ ˆ |d¡ d}tt|ƒƒD ]<}ztjj|| || dd� W qX tk
r’   d}Y qXX qX|�r|\}}tt|ƒƒD ]}ˆ || j	|| j	¡ q°t 
||¡}t | j¡j}	tjj| |d|	 d|	 d� ˆ t 
t |j¡|¡¡ ˆ ¡ � ˆ | f|Ž W 5 Q R X d S )	Nr‚   rX   Fr  r7  Tr  r)  )r´   rC   r=   r  r\   r   r  r8  rb   ra   r   r  r2   r  r  r  Ú	conjugater„   rM   )
r   r9  rQ   rR   r:  r‹   rP  Úrr;  r  r<  r   r   r=  î  s<      ÿ

ü
z*TestLinalgQr.test_linalg_qr.<locals>.checkr   r"  r$  r%  r&  r'  r³   r?  rT   r  rÝ   re  rz  N)r   r´   r   rx   rý   r  r   r@  r3  r
  ry   r  rñ   rf  rg  r  r[   )	r(   r=  r4  rY   r2   rW   r   rT  r}  r   r<  r   Útest_linalg_qrç  s*    7ÿ
ÿÿÿÿzTestLinalgQr.test_linalg_qrc                 C   sª   t jddddgddddgddd	d	gdd
ddggdd�}t  |¡}tdd�dd„ ƒ}| |d¡}t j ||¡ ||dƒ}t j ||¡ t||ƒD ]\}}t j ||¡ qŽd S )NrÝ   ru   r‚   r!  rB  r�   rC  r2  r   r  rD  rX   rV   Trv   c                 S   s$   |r| dd…d d …f } t j | ¡S rE  r²   rF  r   r   r   ri  I  s    z1TestLinalgQr.test_no_input_mutation.<locals>.funcF)r   rñ   rg   r   r”   r  r  r  r€  r   r   r   rL  @  s     


ýý


z#TestLinalgQr.test_no_input_mutationN)r–   r—   r˜   r™   r   r„  rL  r   r   r   r   r�  â  s
   
Xr�  c                   @   s*   e Zd ZdZd
dd„Zdd„ Zdd„ Zd	S )ÚTestLinalgSystemszu
    Base class for testing "system" solvers from np.linalg.
    Namely np.linalg.solve() and np.linalg.lstsq().
    Tc                 C   s.   |rdnd}d||f }|   |||tj¡ d S )Nr  r   z*%s.%s() only supported on 1 and 2-D arraysr  r  r   r   r   Úassert_wrong_dimensions_1Da  s    z,TestLinalgSystems.assert_wrong_dimensions_1Dc                 C   s   d}|   |||tjj¡ d S )Nz<Incompatible array sizes, system is not dimensionally valid.r   r  r   r   r   Úassert_dimensionally_invalidg  s    z.TestLinalgSystems.assert_dimensionally_invalidc                 C   s   d| }|   |||tj¡ d S )NzAnp.linalg.%s() only supports inputs that have homogeneous dtypes.r  r  r   r   r   Úassert_homogeneous_dtypesl  s    z+TestLinalgSystems.assert_homogeneous_dtypesN)T)r–   r—   r˜   r™   r†  r‡  rˆ  r   r   r   r   r…  Z  s   
r…  c                   @   s(   e Zd ZdZedd„ ƒZedd„ ƒZdS )ÚTestLinalgLstsqz$
    Tests for np.linalg.lstsq.
    c                    s  t dd�tƒ‰ ‡ ‡fdd„‰ddddd	g}tˆjƒ}d
dg}t|ƒ‰d}‡‡‡fdd„}|D ]¢}t|ƒ}tˆƒ}ˆ |||¡}	||	|ƒ |\}
}t|
|ƒ}|
dkr\|dkr\|d }ˆj||||d�}	||	|ƒ ˆj||||d�}	d| }|| }||	||d� q\ddgddgddgddgg}|D ]*\}	}t |	¡t |¡f}ˆ 	ˆ |¡ �q tj
ddgddggtjd�}ˆ ||ff d}tj
ddgdd ggtjd�}ˆ |ˆ ||f¡ ˆ |ˆ ||f¡ tj
ddgdd ggtjd�}ˆ |ˆ ||f¡ ˆ |ˆ ||f¡ tj
ddgtjd�}ˆ |ˆ ||f¡ tj
ddgtjtjggtjd�}ˆ ˆ ||f¡ ˆ ˆ ||f¡ tj
ddgtjd�}ˆ ||ff tj
ddgdd ggd!d"gd#d$gggtjd�}ˆ |ˆ ||f¡ tj
dgtjd�}tj
dgdgdggtjd�}ˆ ˆ ||f¡ ˆ ˆ ||f¡ d%S )&z&
        Test np.linalg.lstsq
        Trv   c                    sŠ  t | |f|Ž}ˆ | |f|Ž}ˆ t|ƒt|ƒ¡ ˆ t|ƒd¡ ˆ |d¡ d}zbˆ |d |d ¡ tt|ƒƒD ]<}ztjj|| || dd� W qr tk
r¬   d}Y qrX qrW n tk
rÊ   d}Y nX |�rd|\}}}	}
dd	d
g}zFˆ |	|d ¡ |D ],}t	|| tj
ƒrþˆ || j|| j¡ qþW n0 tk
�r^   ˆ t|	|d  ƒdk ¡ Y nX t | j¡j}z,t | |¡}tjj||d| d| d� W nÈ tk
�rb   |D ]¬}z(tjj|| || d| d| d� W n6 tk
�r   tj | ¡}ˆ d| d| ¡ Y nX tj |t | |d ¡ ¡}tj |t | |¡ ¡}tjj||dd� �q°Y nX ˆ ¡ � ˆ | |f|Ž W 5 Q R X d S )Nr�   rU   Fr‚   r  r7  Tr   r   ru   r)  r  rÝ   r*  ©r  )rº   rC   r=   r  r\   r   r  r8  rb   rì   Zndarrayra   r  Úabsr  r2   r  r   r  r    rÊ   ZassertGreaterrÇ   rM   )r·   r¸   r9  rQ   rR   r:  r‹   ÚxÚresrò   rx  Zout_array_idxr  r;  rt  Zres_expectedZres_gotr<  r   r   r=  †  sz      ÿ


 ü
ü
ÿ  ÿ
z0TestLinalgLstsq.test_linalg_lstsq.<locals>.checkr   r"  r$  r%  r&  rX   rU   r*  c                    sn   d}|D ]`}t ˆƒ}ˆ | jd |f||¡}ˆ | |f|Ž t ˆƒ}|d d …df j|d�}ˆ | |f|Ž qd S )N©r   é   r   rV   )Únextrý   ra   rg   )r·   Údtr9  Úb_sizesÚb_sizeÚb_orderr¸   rc   )r=  Úcycle_orderr(   r   r   Úinner_test_loop_fnõ  s      ÿz=TestLinalgLstsq.test_linalg_lstsq.<locals>.inner_test_loop_fnr   r(  r+  rÝ   ©r¹   r{  r0  r|  ©r   r   ©r   re  ç      @ç      @rT   r¶   r‚   ru   r�   r  é   r!  rD  N)r   rº   r   rx   r�  rý   rë   r   r[   r  rñ   ry   r3  r  rz   rˆ  r
  rf  rg  r  r†  r‡  )r(   r4  Zcycle_dtÚordersÚspecific_condr–  Za_sizer‘  Za_orderr·   r6   r1   rô   rƒ  r¹   Úapprox_half_rank_rcondZemptiesr   rP   ÚokrT  ÚbadZoneDÚbad1DÚbad2Dr   )rO   r=  r•  r(   r   Útest_linalg_lstsq  s‚    \


   ÿ
   ÿÿü ,z!TestLinalgLstsq.test_linalg_lstsqc              	   C   sŽ   t jdddgdddgdddgddd	gdd
dgdddggdd�}t  |¡}t  ddddddg¡}tdd�dd„ ƒ}|||dƒ t j ||¡ d S )NrÝ   g)\�Âõ(@g®Gáz@gš™™™™™@r›  g      @gffffff@gffffffò?g�Âõ(\�@gáz®Gá@g)\�Âõ(
@g�Âõ(\�ö?gÍÌÌÌÌÌ@rX   rV   re  rš  ç      @g      @Trv   c                 S   s&   |r| dd…d d …f } t j | |¡S rE  rµ   ©rG  ÚyrH  r   r   r   Úf2n  s    z*TestLinalgLstsq.test_issue3368.<locals>.f2F)r   rñ   rg   r   r  r  )r(   rG  rK  r§  r¨  r   r   r   Útest_issue3368b  s    ûû

zTestLinalgLstsq.test_issue3368N)r–   r—   r˜   r™   r   r¤  r©  r   r   r   r   r‰  q  s   
 cr‰  c                   @   s(   e Zd ZdZedd„ ƒZedd„ ƒZdS )ÚTestLinalgSolvez$
    Tests for np.linalg.solve.
    c                    s¢  t dd�tƒ‰ ‡ ‡fdd„}dddg}t|ˆjdƒD ]t\}}}ˆ |||¡}d	}t|dƒD ]L\}}	ˆ |jd
 |f||	¡}
|||
ƒ |
dd…d
f j|	d�}|||ƒ qZq4ˆ t d¡t d¡ƒ tj	ddgddggtj
d�}ˆ ||ƒ d}tj	dd
gd
dggtjd�}ˆ |ˆ ||f¡ ˆ |ˆ ||f¡ tj	ddgddggtjd�}ˆ |ˆ ||f¡ ˆ |ˆ ||f¡ tj	dd
gtj
d�}ˆ |ˆ ||f¡ tj	ddgtjtjggtj
d�}ˆ ˆ ||f¡ ˆ ˆ ||f¡ tj	ddgtj
d�}ˆ ||ƒ tj	ddgddggddgddgggtj
d�}ˆ |ˆ ||f¡ tj	dgtj
d�}tj	dgdgdggtj
d�}ˆ ˆ ||f¡ ˆ ˆ ||f¡ ˆjdtj
ddd�}ˆ ˆ ||f¡ dS ) z&
        Test np.linalg.solve
        Trv   c              	      sÌ   t | |f|Ž}ˆ | |f|Ž}ˆ |d¡ d}ztjj||dd� W n tk
rZ   d}Y nX |r¦ˆ |j|j¡ t | |¡}t 	| j
¡j}tjj||d| d| d� ˆ ¡ � ˆ | |f|Ž W 5 Q R X d S )NrX   Fr  r7  Tr  r)  )r½   r  r   r  r8  rb   rC   ra   r   r  r2   r  r  rM   )r   r   r9  rQ   rR   r:  r;  r  r<  r   r   r=  …  s0      ÿ


ü
z0TestLinalgSolve.test_linalg_solve.<locals>.checkr˜  r%  ©r!  r!  r'  rŽ  r   NrV   r>  r™  rÝ   ç        rT   r¼   r   r‚   ru   r�   re  r  rœ  r!  rD  rš  r?  rU   r(  )r   r½   r   rx   rý   ra   rg   r   r[   rñ   ry   r3  r  rz   rˆ  r
  rf  rg  r  r†  r‡  r  )r(   r=  r4  rY   r2   rW   r·   r’  r“  r”  r¸   rc   r   rT  r¡  Zok_oneDr¢  r£  r   r<  r   Útest_linalg_solve~  sR    +
ÿ  ÿ

 
,z!TestLinalgSolve.test_linalg_solvec                 C   sÒ   t jddddgddddgddddgddddggdd�}t  |¡}t  dddd	g¡}t  |¡}td
d�dd„ ƒ}| ||d¡}t j ||¡ t j ||¡ |||dƒ}t j ||¡ t j ||¡ t j ||¡ d S )NrÝ   r   r¬  r   rX   rV   re  rš  r�   Trv   c                 S   s&   |r| dd…d d …f } t j | |¡S rE  r»   r¦  r   r   r   ri  þ  s    z4TestLinalgSolve.test_no_input_mutation.<locals>.funcFrJ  )r(   rG  rK  r§  Zy_origri  rQ   rR   r   r   r   rL  ó  s&    


ýý


z&TestLinalgSolve.test_no_input_mutationN)r–   r—   r˜   r™   r   r­  rL  r   r   r   r   rª  y  s
   
trª  c                   @   s(   e Zd ZdZedd„ ƒZedd„ ƒZdS )ÚTestLinalgPinvz#
    Tests for np.linalg.pinv.
    c                    s0  t dd�tƒ‰ ‡ ‡fdd„}ddddd	g}d
}t|ˆjdƒD ]p\}}}ˆ |||¡}||ƒ |\}}	|dkr<|	dkr<t||	ƒ}
ˆj||||d�}d| }|
| }|||d� q<dD ]}|t |¡ƒ q²d}ˆ |ˆ tj	dtj
d�f¡ ˆ |ˆ tj	dtjd�f¡ ˆ ˆ tjddgtjtjggtjd�f¡ dS )z%
        Test np.linalg.pinv
        Trv   c           	   	      sx  t | f|Ž}ˆ | f|Ž}ˆ |d¡ d}ztjj||dd� W n tk
rV   d}Y nX |�rTˆ |j|j¡ t || ¡}zˆ 	|¡ W nÊ tk
�rR   dt 
| j¡j }ˆ |ƒ}tjj|| d| d| d� | jd	 | jd
 k�r6tdd�tƒ}|| t | jd	 ¡ | j¡f|Žd	 }tjj||d| d| d� ˆ tj || ¡|¡ Y nX ˆ ¡ � ˆ | f|Ž W 5 Q R X d S )NrX   Fr  r7  Tr  r  r)  r   r   rv   )rÁ   r  r   r  r8  rb   rC   ra   r   r  r  r2   r  r  r   rº   rð   r/   Z
assertLessr    rÇ   rM   )	r   r9  rQ   rR   r:  r;  r  r¶   Z
lstsq_pinvr<  r   r   r=    sb      ÿ

ü ÿþÿýýü
z.TestLinalgPinv.test_linalg_pinv.<locals>.checkr   r"  r$  r%  r&  r*  r'  r   r+  rÝ   r—  )r{  r|  rÀ   r?  rT   r  re  N)r   rÁ   r   rx   rý   rë   r   r[   r  r@  r3  r
  ry   r  rñ   rf  rg  )r(   r=  r4  rž  rY   r2   rW   r   r6   r1   rô   r¹   rŸ  r}  rT  r   r<  r   Útest_linalg_pinv  s>    Dÿ

ÿÿÿÿÿzTestLinalgPinv.test_linalg_pinvc                 C   sœ   t dd�dd„ ƒ}tjddddgd	d
ddgddddgddddggdd�}t |¡}| d¡}| |¡}tj ||¡ ||ƒ}tj ||¡ tj ||¡ d S )NTrv   c                 S   s   t j | d ¡S )Nr   r¿   )rW  r   r   r   Úsome_fnŒ  s    z.TestLinalgPinv.test_issue5870.<locals>.some_fnrÝ   ru   r‚   r!  rB  r�   rC  r2  r   r  rD  rX   rV   )r   r�   r�   )r   r   rñ   rg   r5   r”   r  r  )r(   r°  Zv_dataZv_origZ
reshaped_vrQ   rR   r   r   r   Útest_issue5870‰  s     



ýý


zTestLinalgPinv.test_issue5870N)r–   r—   r˜   r™   r   r¯  r±  r   r   r   r   r®    s
   
sr®  c                   @   sL   e Zd ZdZdd„ Zdd„ Zdd„ Zedd	„ ƒZed
d„ ƒZ	edd„ ƒZ
dS )ÚTestLinalgDetAndSlogdetzÄ
    Tests for np.linalg.det. and np.linalg.slogdet.
    Exactly the same inputs are used for both tests as
    det() is a trivial function of slogdet(), the tests
    are therefore combined.
    c              	   K   s`   t |f|Ž}||f|Ž}dt |j¡j }tjj|||d� |  ¡ � ||f|Ž W 5 Q R X d S ©Nr  rŠ  )rÆ   r   r  r2   r  r  r  rM   )r(   rO   r   r9  rQ   rR   r  r   r   r   Ú	check_det©  s    
z!TestLinalgDetAndSlogdet.check_detc           	   	   K   sâ   t |f|Ž}||f|Ž}|  t|ƒt|ƒ¡ |  t|ƒd¡ tdƒD ]$}|  t || ¡t || ¡¡ qD|j |d ¡}tjj	||d dd� dt 
|j¡j }tjj|d |d ||d� |  ¡ � ||f|Ž W 5 Q R X d S )Nr‚   r   r  r7  r  r   r)  )rÄ   rC   r=   r\   r   r\  r2   Útyper  r8  r  r  r  rM   )	r(   rO   r   r9  rQ   rR   r‹   Zgot_convr  r   r   r   Úcheck_slogdet¶  s0    þ  ÿ   ÿ
z%TestLinalgDetAndSlogdet.check_slogdetc           	      C   sà   dddg}t || jdƒD ]"\}}}|  |||¡}|||ƒ qt | jdƒD ] \}}tjd|d�}|||ƒ qH||t d¡ƒ |  ||tjdtjd�f¡ |  	||tjd	tj
d�f¡ |  |tjd
dgtjtjggtj
d�f¡ d S )Nr˜  )r�   r�   r«  r'  r%  rT   r>  r?  r  rÝ   re  )r   rx   rý   r   rî   r[   r  r@  r3  r
  ry   r  rñ   rf  rg  )	r(   rT  r=  rO   r4  rY   r2   rW   r   r   r   r   Údo_testÙ  s(    
ÿÿÿÿÿzTestLinalgDetAndSlogdet.do_testc                 C   s"   t dd�tƒ}|  d| j|¡ d S )NTrv   rÅ   )r   rÆ   r·  r´  ©r(   rO   r   r   r   Útest_linalg_detú  s    z'TestLinalgDetAndSlogdet.test_linalg_detc                 C   s"   t dd�tƒ}|  d| j|¡ d S )NTrv   rÃ   )r   rÄ   r·  r¶  r¸  r   r   r   Útest_linalg_slogdetÿ  s    z+TestLinalgDetAndSlogdet.test_linalg_slogdetc                 C   s–   t jddddgddddgddd	d	gdd
ddggdd�}t  |¡}tdd�dd„ ƒ}| |d¡}t j ||¡ ||dƒ}t j ||¡ t j ||¡ d S )NrÝ   ru   r‚   r!  rB  r�   rC  r2  r   r  rD  rX   rV   Trv   c                 S   s$   |r| dd…d d …f } t j | ¡S rE  rÂ   rF  r   r   r   ri    s    z<TestLinalgDetAndSlogdet.test_no_input_mutation.<locals>.funcFrJ  ©r(   rG  rK  ri  rQ   rR   r   r   r   rL    s    


ýý


z.TestLinalgDetAndSlogdet.test_no_input_mutationN)r–   r—   r˜   r™   r´  r¶  r·  r   r¹  rº  rL  r   r   r   r   r²  ¡  s   #!

r²  c                   @   s   e Zd ZdZedd„ ƒZdS )ÚTestLinalgNormz#
    Tests for np.linalg.norm.
    c           
         s†  t dd�tƒ‰ ‡ ‡fdd„}dddg}dtjtj d	dd
dddddg}t|ˆj|ƒD ]"\}}}ˆ ||¡}|||d� qTtˆj|ƒD ]*\}}ˆ d|¡ddd… }|||d� q„dddddg}dtjtj dd
ddg}t|ˆjd|ƒD ]&\}}}}ˆ |||¡}|||d� qædg}tˆj|dƒD ]d\}}}ˆ d||¡}||dd… |d� ||dd…dd…f |d� ||dddd…f |d� �q"tˆj|dƒD ]P\}}}tjd||d�}ˆ 	ˆ ||ƒd¡ tjd||d�}ˆ 	ˆ ||ƒd¡ �q–d}	ˆ 
|	ˆ tjdtjd �f¡ ˆ |	ˆ tjd!tjd � ddd¡f¡ ˆ ˆ tjd"d#gtjtjggtjd �df¡ ˆ ˆ tjd"d#gd$d%ggtjd �d&f¡ dS )'z%
        Test np.linalg.norm
        Trv   c              	      sr   t | f|Ž}ˆ | f|Ž}ˆ t |¡ ¡ dt | j¡j }tjj|||d� ˆ 	¡ � ˆ | f|Ž W 5 Q R X d S r³  )
rÉ   r  r   r\  r  r2   r  r  r  rM   ©r   r9  rQ   rR   r  r<  r   r   r=  ,  s    
z.TestLinalgNorm.test_linalg_norm.<locals>.checkr   r�   r!  Nr   rw   r‚   r  r  gÍÌÌÌÌÌ@g333333À)rÈ   r  ru   r   r"  r$  r%  r&  r'  )é   r�  r™  rè   r¬  r>  rÇ   r?  rT   é   rÝ   re  rš  r›  rœ  )r   rÉ   r   rf  r   rx   r4   rý   r[   rC   r  r@  r3  r†  ry   r5   r  rñ   rg  r  )
r(   r=  r4  Z	nrm_typesrY   r2   Znrm_typer   rW   rT  r   r<  r   Útest_linalg_norm%  sv    
 ÿ
ÿ
ÿÿÿÿ   ÿ  þÿÿÿÿÿÿzTestLinalgNorm.test_linalg_normN)r–   r—   r˜   r™   r   rÀ  r   r   r   r   r¼     s   r¼  c                   @   s   e Zd ZdZedd„ ƒZdS )ÚTestLinalgCondz#
    Tests for np.linalg.cond.
    c              	      sü  t dd�tƒ‰ ‡ ‡fdd„}dtjtj dddd	g}d
dg}t|ˆjd|ƒD ]&\}}}}ˆ |||¡}|||d� qLddddg}t|ˆjdƒD ] \}}}ˆ |||¡}||ƒ qŽdD ]}	ˆ ˆ t |	¡f¡ q´tj	ddgddggtj
d�}
||
ƒ ||
dd� tj	ddgddggtj
d�}
||
d	d� t ¡ �6 tj	ddgddggtj
d�}t dt¡ ||ƒ W 5 Q R X d}ˆ |ˆ tjdtjd�f¡ ˆ |ˆ tjdtj
d�f¡ ˆ ˆ tj	ddgtjtjggtj
d�f¡ ˆ ˆ tj	ddgddggtj
d�df¡ dS ) z%
        Test np.linalg.cond
        Trv   c              	      sr   t | f|Ž}ˆ | f|Ž}ˆ t |¡ ¡ dt | j¡j }tjj|||d� ˆ 	¡ � ˆ | f|Ž W 5 Q R X d S r³  )
rÌ   r  r   r\  r  r2   r  r  r  rM   r½  r<  r   r   r=  –  s    
z.TestLinalgCond.test_linalg_cond.<locals>.checkNr   rw   r‚   r  r%  r«  r'  )rË   r   r"  r$  r&  rz  r   rT   g Èë…óÌágš™™™™™¹?ÚignorerÊ   r?  r  rÝ   re  rš  r›  rœ  )r   rÌ   r   rf  r   rx   rý   r  r[   rñ   ry   r:   r;   r<   ÚRuntimeWarningr  r@  r3  r
  r  rg  r  )r(   r=  Zpsr4  rY   r2   rW   rË   r   r}  rŒ  rT  r   r<  r   Útest_linalg_condŽ  sR    ÿÿ

ÿÿÿÿÿÿzTestLinalgCond.test_linalg_condN)r–   r—   r˜   r™   r   rÄ  r   r   r   r   rÁ  ‰  s   rÁ  c                   @   s(   e Zd ZdZedd„ ƒZedd„ ƒZdS )ÚTestLinalgMatrixRankz*
    Tests for np.linalg.matrix_rank.
    c              	      sÎ  t dd�tƒ‰ ‡ ‡fdd„}ddddd	g}t|ˆjd
ƒD �]œ\}}}ˆ |||¡}||ƒ d}tdt|ƒd ƒD ]ü}ˆj||||d�}ˆ ˆ |ƒ|¡ ||ƒ |j\}	}
d|dd…dd…f< t	 
t	 |	|
¡¡}t	 |¡�rdt	j |¡ d dt	j |¡  }d|d< ndt	j |¡ }d|d< | |¡||d d|… |d d|… f< ˆ ˆ ||ƒ|d ¡ |||d� qpd|dd…dd…f< ˆ ˆ |ƒd¡ ||ƒ t	 |¡�r°d|d< nd|d< ˆ ˆ ||ƒd¡ |||d� q8ˆjD ]L}t	jd|d�}ˆ ˆ |ƒd¡ ||ƒ d|d< ˆ ˆ |ƒd¡ ||ƒ �qÞdD ](}dD ]}ˆ ˆ t	 |¡|f¡ �q8�q0d}ˆ |ˆ t	jdt	jd�f¡ ˆ |ˆ t	jdt	jd� ddd¡f¡ ˆ ˆ t	jdd gt	jt	jggt	jd�f¡ dS )!z,
        Test np.linalg.matrix_rank
        Trv   c              	      sJ   t | f|Ž}ˆ | f|Ž}tj ||¡ ˆ ¡ � ˆ | f|Ž W 5 Q R X d S r   )rÐ   r   r  r  rM   )r   r9  rQ   rR   r<  r   r   r=  ê  s
    
z;TestLinalgMatrixRank.test_linalg_matrix_rank.<locals>.checkr   r"  r$  r%  r&  r'  ç‚vIhÂ%<=r   r(  r¬  NrÝ   ù              ð?y›+¡†›„=›+¡†›„=r   g›+¡†›„=)rÏ   )rw   rw   r  rT   rz  )NrÆ  rÎ   r?  r¿  r‚   ru   re  )r   rÐ   r   rx   rý   r\   rë   rC   ra   r   rï   rð   r\  ré   rN  r/   rî   r  r[   r  r@  r3  r†  ry   r5   r  rñ   rf  rg  )r(   r=  r4  rY   r2   rW   r   rÏ   r‹   r6   r1   rü   r   r‘  r}  rT  r   r<  r   Útest_linalg_matrix_rankâ  s€    ÿ
ÿ
*

ÿ   ÿ  þÿÿÿz,TestLinalgMatrixRank.test_linalg_matrix_rankc                 C   s–   t jddddgddddgddd	d	gdd
ddggdd�}t  |¡}tdd�dd„ ƒ}| |d¡}t j ||¡ ||dƒ}t j ||¡ t j ||¡ d S )NrÝ   ru   r‚   r!  rB  r�   rC  r2  r   r  rD  rX   rV   Trv   c                 S   s$   |r| dd…d d …f } t j | ¡S rE  rÍ   rF  r   r   r   ri  T	  s    z9TestLinalgMatrixRank.test_no_input_mutation.<locals>.funcFrJ  r»  r   r   r   rL  G	  s    


ýý


z+TestLinalgMatrixRank.test_no_input_mutationN)r–   r—   r˜   r™   r   rÈ  rL  r   r   r   r   rÅ  Ý  s
   
drÅ  c                   @   s$   e Zd ZdZdd„ Zedd„ ƒZdS )ÚTestLinalgMatrixPowerz+
    Tests for np.linalg.matrix_power.
    c              	   C   s2   ||d dƒ |   tj¡� ||Ž  W 5 Q R X d S )Nr   r   ©rj   r	   rr   )r(   rO   rP   r   r   r   Úassert_int_exponenenti	  s    z+TestLinalgMatrixPower.assert_int_exponenentc                    sN  t dd�tƒ‰ ‡ ‡fdd„}dddg}dd	gttd
dƒƒ ddg }t||ˆjdƒD ]>\}}}}ˆ |||¡}|||ƒ tjd||d�}|||ƒ qTd}	ˆ 	|	ˆ tj
dtjd�df¡ ˆ 	|	ˆ tj
dtjd�df¡ t 
d¡df}
d}ˆ ˆ |
|¡ ˆ |	ˆ tj
dtjd�df¡ ˆ ˆ t 
d¡df¡ ˆ ˆ t ddgddgg¡df¡ d S )NTrv   c              	      sh   t | |ƒ}ˆ | |ƒ}ˆ |d¡ dt | j¡j }tjj||||d� ˆ ¡ � ˆ | |ƒ W 5 Q R X d S )NrU   r  r)  )	rÒ   r  r   r  r2   r  r  r  rM   )r   ÚpwrrQ   rR   r�  r<  r   r   r=  t	  s    


z=TestLinalgMatrixPower.test_linalg_matrix_power.<locals>.checkr˜  ©r  r  r«  ißÿÿÿiïÿÿÿéöÿÿÿr  r¾  é!   r'  r>  rè   rÑ   r?  rT   r   )ru   r  zinput must be a square arrayç333333ó?r¬  r   rw   )r   rÒ   Úlistr\   r   rx   rý   r   r[   r  r@  r3  rÿ   r
  ry   rË  r  rñ   )r(   r=  r4  ZpowersrY   rÌ  r2   rW   r   rT  rP   ro   r   r<  r   Útest_linalg_matrix_powerp	  s2    
ÿ
ÿÿÿz.TestLinalgMatrixPower.test_linalg_matrix_powerN)r–   r—   r˜   r™   rË  r   rÒ  r   r   r   r   rÉ  d	  s   rÉ  c                       s8   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Z‡  ZS )
Ú	TestTracez
    Tests for np.trace.
    c                    s2   t t| ƒ ¡  tdd�tƒ| _tdd�tƒ| _d S )NTrv   )r%   rÓ  r&   r   rÖ   Úcfunc_w_offsetr×   Úcfunc_no_offsetr'   r)   r   r   r&   «	  s    zTestTrace.setUpc              	   K   s0   ||ƒ |   tj¡� ||f|Ž W 5 Q R X d S r   rÊ  )r(   rO   r   r9  r   r   r   Úassert_int_offset±	  s    zTestTrace.assert_int_offsetc           
         s  ‡ fdd„}dddddg}dd	d
gt tddƒƒ dddg }t||ˆ jdƒD ]b\}}}}ˆ  |||¡}|||d� |dkr‚||ƒ tjd||d�}|||d� |dkrL||ƒ qLd}	ˆ  |	ˆ jtj	dtj
d�dfd¡ ˆ  |	ˆ jtj	dtj
d�fd¡ ˆ jˆ jt 	d¡dd� d S )Nc              	      s„   d|krt | f|Ž}ˆ j}nt| f|Ž}ˆ j}|| f|Ž}dt | j¡j }tjj	||||d� ˆ  
¡ � || f|Ž W 5 Q R X d S )NrÕ   r  r)  )rÖ   rÔ  r×   rÕ  r   r  r2   r  r  r  rM   )r   r9  rQ   rO   rR   r�  r'   r   r   r=  º	  s    
z#TestTrace.test_trace.<locals>.checkr   r"  r$  r%  r&  ióÿÿÿiôÿÿÿiõÿÿÿrÎ  r  r#  r¿  r�  r'  )rÕ   r   r>  rè   rÔ   rT   r   Fr?  rÐ  )rÑ  r\   r   rx   rý   r   r[   r
  rÔ  r@  ry   rÕ  rÖ  )
r(   r=  r4  ÚoffsetsrY   rÕ   r2   rW   r   rT  r   r'   r   Ú
test_trace¸	  s:    "ÿ

 ÿ
 ÿ ÿþzTestTrace.test_tracec              	   C   sd   t ddd�dd„ ƒ}tjdtjd�}||ƒ |  t¡�}|dƒ W 5 Q R X t|jƒ}|  d	|¡ dS )
z
Issue 2314z(optional(float64[:,:]),)Trv   c                 S   s
   t  | ¡S r   rÓ   r¢   r   r   r   Útestedì	  s    z5TestTrace.test_trace_w_optional_input.<locals>.testedrÍ  rT   Nz(expected array(float64, 2d, A), got None)	r   r   r@  ry   rj   Ú	TypeErrorrA   rl   rC   )r(   rÙ  r   rn   Úerrmsgr   r   r   Útest_trace_w_optional_inputê	  s    


z%TestTrace.test_trace_w_optional_input)	r–   r—   r˜   r™   r&   rÖ  rØ  rÜ  rž   r   r   r)   r   rÓ  ¦	  s
   2rÓ  c                   @   sh   e Zd ZeddddgƒZeddddgƒZddddddd	d
gZdd„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )Ú
TestBasicsrX   rU   r   r%  r&  )r!  r0  )ru   rš  r¥  c              	   C   s\   |   ||tjdgggtjd�t d¡fd¡ |   ||t d¡tjdgggtjd�fd¡ d S )Nr   rT   F)r†  r   rñ   ry   r@  )r(   rT  rO   r   r   r   Ú_assert_wrong_dim
  s       ÿ   ÿzTestBasics._assert_wrong_dimc                 C   sP   t |tƒs|S t|ƒdkr*|  |d |¡S |  |d |d  |¡j||d�S d S )Nr   r   rV   )rì   r  r=   r4   r5   )r(   rY   r2   rW   r   r   r   Ú
_gen_input

  s    
þ ýzTestBasics._gen_inputc                 C   sT   |   ||t| jƒ¡}|   ||t| jƒ¡}t |¡r:|d }t |¡rL|d }||fS )NrÇ  )rß  r�  Úorder1Úorder2r   r\  )r(   Úsize1Úsize2r2   r   r   r   r   r   Ú
_get_input
  s    

zTestBasics._get_inputc           	         sª   t dd�tƒ‰ ‡ ‡fdd„}tˆjƒ}tˆjˆjƒD ]d\}}t|ƒ}ˆ |||¡\}}|||ƒ tj	t 
|¡jt 
|¡jft 
|¡jd�}||||d� q4ˆ dˆ ¡ d S )NTrv   c              	      s¨   t | |ƒ}ˆ | |ƒ}dt t | ¡j¡j }tjj||||d� d|kr‚ˆ | |f|Ž}tjj||||d� tjj|d |||d� ˆ ¡ � ˆ | |f|Ž W 5 Q R X d S )Nr  r)  r   )	rÙ   r   r  Úasarrayr2   r  r  r  rM   ©r   r   r9  rQ   rR   r�  r<  r   r   r=  #
  s    

ÿ ÿ
z$TestBasics.test_outer.<locals>.checkrT   r   rØ   )r   rÙ   r   rx   r   r4  r�  rä  r   r[   rå  rY   r2   rÞ  )	r(   r=  Údtsrâ  rã  r2   r   r   rt  r   r<  r   Ú
test_outer 
  s    


ÿzTestBasics.test_outerc           	         s¦   t dd�tƒ‰ ‡ ‡fdd„}tˆjˆjˆjƒD ]&\}}}ˆ |||¡\}}|||ƒ q.ˆ dˆ ¡ t d¡d d d… t d¡d d d… f}d}ˆj	ˆ ||t
jd	� d S )
NTrv   c              	      sb   t | |ƒ}ˆ | |ƒ}dt t | ¡j¡j }tjj||||d� ˆ ¡ � ˆ | |ƒ W 5 Q R X d S )Nr  r)  )	rÛ   r   r  rå  r2   r  r  r  rM   ræ  r<  r   r   r=  F
  s    


z#TestBasics.test_kron.<locals>.checkrÚ   r  r‚   zonly supports 'C' or 'F' layoutr  )r   rÛ   r   r4  rx   rä  rÞ  r   r[   rÿ   r	   rr   )	r(   r=  râ  rã  r2   r   r   rP   ro   r   r<  r   Ú	test_kronC
  s    ÿ(zTestBasics.test_kronN)r–   r—   r˜   r   rà  rá  r4  rÞ  rß  rä  rè  ré  r   r   r   r   rÝ  ú	  s   
#rÝ  c                   @   s   e Zd Zdd„ ZdS )ÚTestHelpersc                    s–   ddl m‰  ‡fdd„}t‡ fdd„ƒ}ddg}tjg}d	d
g}||tj|||ƒ t‡ fdd„ƒ}ddg}tjg}d	d
g}dd„ }||||||ƒ d S )Nr   ©Ú_copy_to_fortran_orderc           
         sb   t |||ƒD ]P\}}}t t |¡¡j||d�}| |ƒ}	ˆ  ||ƒ|	¡ ˆ  |jj|	jj¡ qd S )NrV   )	r   r   r-   Úprodr5   rN   ZassertNotEqualÚctypesÚdata)
ZudtZexpectfnÚshapesrx   r�  ra   r2   rW   r   rƒ  r'   r   r   r=  b
  s
    z5TestHelpers.test_copy_to_fortran_order.<locals>.checkc                    s   ˆ | ƒS r   r   r¢   rë  r   r   Údirect_calll
  s    z;TestHelpers.test_copy_to_fortran_order.<locals>.direct_call)ru   r�   )ru   r‚   r  rU   rX   c                    s   | d d d… d }ˆ |ƒS ©Nr‚   r   r   ©r   Zslicedrë  r   r   Úslice_to_anyv
  s    z<TestHelpers.test_copy_to_fortran_order.<locals>.slice_to_any)ru   ru   r�   )ru   ru   r‚   r  c                 S   s   | d d d… d }t  |¡S rò  )r   Úasfortranarrayró  r   r   r   Úexpected_slice_to_any€
  s    zETestHelpers.test_copy_to_fortran_order.<locals>.expected_slice_to_any)Znumba.np.linalgrì  r   r   Zintprõ  )r(   r=  rñ  rð  rx   r�  rô  rö  r   )rì  r(   r   Útest_copy_to_fortran_order_
  s    
z&TestHelpers.test_copy_to_fortran_orderN)r–   r—   r˜   r÷  r   r   r   r   rê  ^
  s   rê  Ú__main__)r   )rw   )r¾   )N)N)N)r   )N)Jrœ   r#   Ú	itertoolsr   r   Úsysr:   Únumbersr   r   ÚplatformÚnumpyr   Znumbar   r   r   Z
numba.corer	   Znumba.tests.supportr
   r   r   r   r   r   r   Zunittestr   r    r!   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  rM  rV  ru  r�  r…  r‰  rª  r®  r²  r¼  rÁ  rÅ  rÉ  rÓ  rÝ  rê  r–   Úmainr   r   r   r   Ú<module>   sˆ      1







 FjQS n x  
  iT BTd)
