o
    8ήc	w                    @   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 ddlmZ d dlZd	d
 Zdd Zdd ZG dd d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,dgd/d0Z-dgd1d2Z.d3d4 Z/dhd5d6Z0d7d8 Z1dgd9d:Z2d;d< Z3G d=d> d>eZ4G d?d@ d@eZ5G dAdB dBe4Z6G dCdD dDe4Z7G dEdF dFe4Z8G dGdH dHe4Z9G dIdJ dJe4Z:G dKdL dLe4Z;G dMdN dNe;Z<G dOdP dPe;Z=G dQdR dRe4Z>G dSdT dTe4Z?G dUdV dVe;Z@G dWdX dXe4ZAG dYdZ dZe;ZBG d[d\ d\e4ZCG d]d^ d^e4ZDG d_d` d`e;ZEG dadb dbeZFeGdckrceH  dS dS )i    N)productcycle)NumberIntegral)jitnjittypeof)errors)TestCasetagneeds_lapack
needs_blas
_is_armv7l   )matmul_usecasec                 C      t | |S Nnpdotab r   >/tmp/pip-target-vg8gfxp4/lib/python/numba/tests/test_linalg.pydot2      r   c                 C      t j| ||dS Noutr   r   r   r    r   r   r   dot3      r"   c                 C   r   r   )r   vdotr   r   r   r   r$      r   r$   c                   @   s   e Zd ZdZejejejejfZ	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 d,S )/TestProductz!
    Tests for dot products.
    c                 C      t   d S r   gccollectselfr   r   r   setUp&      zTestProduct.setUpc                 C   s:   t |}t|t jr|d d |S |d d |S Ny      ?      y               @g      ?r   r   arange
issubclasscomplexfloatingastyper+   ndtypebaser   r   r   sample_vector*      
zTestProduct.sample_vectorc                 C   s   |  || |||fS r   )r8   reshape)r+   mr5   r6   r   r   r   sample_matrix3   s   zTestProduct.sample_matrixc                 c   s    t jdd}t dtj dV  W d   n1 sw   Y  | 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	   NumbaPerformanceWarningassertGreaterEquallenassertIscategoryassertInstrmessageassertEqualfilename__code__co_filenamelinenoco_firstlineno)r+   pyfuncwr   r   r   check_contiguity_warning6   s   z$TestProduct.check_contiguity_warningc                 C   sR   |    || }|| }| j||dd ~~W d    d S 1 s"w   Y  d S )NTignore_sign_on_zero)assertNoNRTLeakassertPreciseEqual)r+   rP   cfuncargsexpectedgotr   r   r   
check_funcE   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	r4 nqt
d|jjrGtj||jdd}n	tj||jdd}|d d  |d d < |jj	s`J |S )Nr   r6   zCould not obtain aligned arrayCorderF)sizeitemsizer   emptyuint8rangeviewr6   flagsaligned	Exceptionc_contiguousr:   shape)r+   arrra   datasizetmpinewr   r   r   _aligned_copyM   s   zTestProduct._aligned_copyc                 C   s   t r| jntj}|  1 ||}||}| ||d|i| | ||d|i| | j||dd ~~W d    d S 1 s@w   Y  d S )Nr    TrS   )r   rq   r   copyrU   rE   rV   )r+   rP   rW   rX   r    copierrY   rZ   r   r   r   check_func_outb   s   
"zTestProduct.check_func_outFc                 C   sT   |  t}||  W d    n1 sw   Y  |rdnd}| |t|j d S )Nzincompatible output array sizezincompatible array sizes)assertRaises
ValueErrorrG   rH   	exception)r+   rW   rX   is_outraisesmsgr   r   r   assert_mismatching_sizesl   s   
z$TestProduct.assert_mismatching_sizesnp.dot()c                 C   sP   |  tj}||  W d    n1 sw   Y  | d|f t|j d S )Nz)%s arguments must all have the same dtype)ru   r	   TypingErrorrG   rH   rw   )r+   rW   rX   	func_namery   r   r   r   assert_mismatching_dtypess   s   
z%TestProduct.assert_mismatching_dtypesc              
   C   s   d}t dd|}| jD ]*}| ||}| ||}| ||||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nopythonr   )r~   )	r   dtypesr8   r[   r   float64r{   float32r   )r+   rP   r~   r5   rW   r6   r   r   r   r   r   check_dot_vvz   s   
(zTestProduct.check_dot_vvc                 C      |  td dS )z/
        Test vector * vector np.dot()
        r|   N)r   r   r*   r   r   r   test_dot_vv      zTestProduct.test_dot_vvc                 C   r   )z 
        Test np.vdot()
        z	np.vdot()N)r   r$   r*   r   r   r   	test_vdot   r   zTestProduct.test_vdotc                    s6   fdd}t dd|}|d urt dd|}dD ]L\}}|||D ]\}	}
 |||	|
f  |||
|	jf q#|d urf|||D ]!\}	}
tj||	jd} |||	|
f|  |||
|	jf| qDqd\}} ||d tj}	 	|tj}
 
||	|
f  
||
|	jf |d urt|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 ur ||tj}	 	|tj}
t|tj} ||	|
|f| d S d S )
Nc                 3   s    dD ]}  | |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CFr^   r   )r<   r   r   rr   r8   r   )r;   r5   r_   r   r   r6   r*   r   r   samples   s   
"z)TestProduct.check_dot_vm.<locals>.samplesTr   )   r   )r   r   )r   r   r\   r   r   rx   )r   r[   Tr   rc   r6   rt   r<   r   r8   r{   r   r   )r+   pyfunc2pyfunc3r~   r   cfunc2cfunc3r;   r5   r   r   r    r   r*   r   check_dot_vm   sJ   
zTestProduct.check_dot_vmc                 C      |  ttd dS )zC
        Test vector * matrix and matrix * vector np.dot()
        r|   N)r   r   r"   r*   r   r   r   test_dot_vm      zTestProduct.test_dot_vmc                    s0   fdd}t dd|}|d urt dd|}dD ]]\}}}	||||	D ]\}
} |||
|f  |||j|
jf q%|d urw||||	D ].\}
}tj||f|
jd} |||
|f| tj||f|
jd} |||j|
jf| qHqd\}}}	 ||	d tj}
 |	|tj} 	||
|f |d urt||ftj} 	||
||f  ||	tj}
 |	|tj}t||d ftj} j	||
||fdd	  ||	tj
}
 |	|tj} ||
|f| |d ur ||	tj}
 |	|tj}t||ftj
} ||
||f| d S d S )
Nc                 3   s    t ddD ]!\}} | |tjj|d} ||tjj|d}||fV  q jD ]} | ||} |||}||fV  q+|d d d |d d d fV  d S r   )r   r<   r   r   rr   r   )r;   r5   korder_aorder_br   r   r6   r*   r   r   r      s   
"z)TestProduct.check_dot_mm.<locals>.samplesTr   )r   r      )r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   r\   r   r   r   )r   r[   r   r   rc   r6   rt   r<   r   r{   r   r   )r+   r   r   r~   r   r   r   r;   r5   r   r   r   r    r   r*   r   check_dot_mm   sF   

zTestProduct.check_dot_mmc                 C   r   )z/
        Test matrix * matrix np.dot()
        r|   N)r   r   r"   r*   r   r   r   test_dot_mm  r   zTestProduct.test_dot_mmc                 C   r   )z&
        Test vector @ vector
        '@'N)r   r   r*   r   r   r   test_matmul_vv  r   zTestProduct.test_matmul_vvc                 C      |  tdd dS )z:
        Test vector @ matrix and matrix @ vector
        Nr   )r   r   r*   r   r   r   test_matmul_vm&  r   zTestProduct.test_matmul_vmc                 C   r   )z&
        Test matrix @ matrix
        Nr   )r   r   r*   r   r   r   test_matmul_mm-  r   zTestProduct.test_matmul_mmc           	      C   sP  d\}}}t j}| |||d d d }| |||d d d }t ||f|}tddt}| |j ||| W d    n1 sEw   Y  tddt}| |j |||| W d    n1 shw   Y  | 	||d d d }| 	||d d d }tddt
}| |j ||| W d    d S 1 sw   Y  d S )Nr   r   Tr   )r   r   r<   rc   r   r   rR   py_funcr"   r8   r$   )	r+   r;   r   r5   r6   r   r   r    rW   r   r   r   test_contiguity_warnings4  s&   
"z$TestProduct.test_contiguity_warningsN)F)r|   )!__name__
__module____qualname____doc__r   r   r   
complex128	complex64r   r,   r8   r<   
contextlibcontextmanagerrR   r[   rq   rt   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r%      s@    	





8
>



r%   c                 C      t j| S r   r   linalginvr   r   r   r   invert_matrixM  r   r   c                 C   r   r   )r   r   choleskyr   r   r   r   cholesky_matrixQ  r   r   c                 C   r   r   )r   r   eigr   r   r   r   
eig_matrixU  r   r   c                 C   r   r   )r   r   eigvalsr   r   r   r   eigvals_matrixY  r   r   c                 C   r   r   )r   r   eighr   r   r   r   eigh_matrix]  r   r   c                 C   r   r   )r   r   eigvalshr   r   r   r   eigvalsh_matrixa  r   r   c                 C      t j| |S r   r   r   svd)r   full_matricesr   r   r   
svd_matrixe     r   c                 C   r   r   r   r   qrr   r   r   r   	qr_matrixi  r   r   r   c                 C   s   t j| ||S r   r   r   lstsq)ABrcondr   r   r   lstsq_systemm  r#   r   c                 C   r   r   r   r   solve)r   r   r   r   r   solve_systemq  r   r   V瞯<c                 C   r   r   r   r   pinv)r   r   r   r   r   pinv_matrixu  r   r   c                 C   r   r   r   r   slogdetr   r   r   r   slogdet_matrixy  r   r   c                 C   r   r   )r   r   detr   r   r   r   
det_matrix}  r   r   c                 C   r   r   )r   r   norm)r   ordr   r   r   norm_matrix  r   r   c                 C   r   r   )r   r   cond)r   pr   r   r   cond_matrix  r   r   c                 C   r   r   r   r   matrix_rank)r   tolr   r   r   matrix_rank_matrix  r   r   c                 C   r   r   )r   r   matrix_power)r   r5   r   r   r   matrix_power_matrix  r   r   c                 C   r   r   r   trace)r   offsetr   r   r   trace_matrix  r   r   c                 C   
   t | S r   r   r   r   r   r   trace_matrix_no_offset  s   
r   c                 C   r   r   )r   outerr!   r   r   r   outer_matrix  r#   r   c                 C   r   r   )r   kronr   r   r   r   kron_matrix  r   r   c                   @   s   e Zd ZdZejejejejfZ	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dS ) TestLinalgBasezU
    Provides setUp and common data/error modes for testing np.linalg functions.
    c                 C   r&   r   r'   r*   r   r   r   r,     r-   zTestLinalgBase.setUpc                 C   s:   t |}t|t jr|d d |S |d d |S r.   r/   r4   r   r   r   r8     r9   zTestLinalgBase.sample_vectorNc                 C   s  d}t |dkrtd|dvrtd|tjtjtjtjfvr$td|dur0|dur0td|du r6|}|d	k r>td
tjd |\}}|dk sP|dk rTtdt	||}	|du r`|	}
n|dkrhtdt
|tsqtd|}
||	kr{td|d	ks|d	kr||krtdt||}| ||||}|S | || |||}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.)r`   r]    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.).r   r6   r_   )rD   rv   r   r   r   r   r   randomseedmin
isinstancer   maxr8   r:   r   r   linspacezerosnonzeroeyer   r   array)r+   ra   r6   r_   rank	conditiond_condr;   r5   minmnrvmaxmnQrn   U_VsvSidxr   r   r   specific_sample_matrix  s\   


"$z%TestLinalgBase.specific_sample_matrixc                 C   sH   |  |}||  W d    n1 sw   Y  | |t|j d S r   )ru   rG   rH   rw   )r+   rW   rX   rz   errry   r   r   r   assert_error
  s   
zTestLinalgBase.assert_errorc                 C      d}|  |||tjj d S )Nz.Last 2 dimensions of the array must be square.r  r   r   LinAlgErrorr+   rW   rX   rz   r   r   r   assert_non_square     z TestLinalgBase.assert_non_squarec                 C      d| }|  |||tj d S )Nz9np.linalg.%s() only supported on float and complex arraysr  r	   r}   r+   namerW   rX   rz   r   r   r   assert_wrong_dtype     z!TestLinalgBase.assert_wrong_dtypeTc                 C   .   |rdnd}d||f }|  |||tj d S )N	np.linalgr   z$%s.%s() only supported on 2-D arraysr   r+   r"  rW   rX   	la_prefixprefixrz   r   r   r   assert_wrong_dimensions     z&TestLinalgBase.assert_wrong_dimensionsc                 C   r  )Nz$Array must not contain infs or NaNs.r  r  r   r   r   assert_no_nan_or_inf  r  z#TestLinalgBase.assert_no_nan_or_infc                 C   s   t |tr|D ]}| || qdS t |tsG|jj}|jj}d}| ||B | d}|dkr7| || dS |dkrC| || dS 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.r]   r`   zUnknown contigN)	r  tupleassert_contig_sanityr   rg   rj   f_contiguous
assertTruerv   )r+   rZ   expected_contigr   c_contigf_contigrz   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_singularE  s   z'TestLinalgBase.assert_raise_on_singularc                 C   sv   |  |jd |jd  tj|jd |jd}dt|jj }|du r(d| }|du r0d| }tj|||| dS )zE
        Checks if a matrix is equal to the identity matrix.
        r   r\      N
   d   )	rJ   rk   r   r  r6   finfo
resolutiontestingassert_allclose)r+   rZ   rtolatolr  r;  r   r   r   assert_is_identity_matrixI  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  rv   r  r   r   r   assert_invalid_norm_kindY  s   z'TestLinalgBase.assert_invalid_norm_kindc                 C   r  )NzArrays cannot be emptyr  r  r   r   r   assert_raise_on_empty`  r  z$TestLinalgBase.assert_raise_on_empty)NNT)r   r   r   r   r   r   r   r   r   r   r,   r8   r  rv   r  r  r#  r*  r,  r.  r5  r@  rA  rB  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 g d}t| jdD ]\}}}|\}}t||} |||}|j| tj	|| |dkrW|d }	 j||||	d}|j| tj	||	 dt
|j }
 |||}|j| tjjtj|d|
|
d |dkrd	} 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 d    n1 sw   Y  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      r7  r7  rI  r   r   r   rG  FCr   r	  r7  r   r>  r?        $@r
  c                    sJ    |} j|   W d    n1 sw   Y  |t|j d S r   )ru   r  rG   rH   rw   )rX   rz   r  ry   instr+   r   r   check_error  s   zCTestTestLinalgBase.test_specific_sample_matrix.<locals>.check_errorblankr   r`   r4  r   r   r   zr   r   r   r   r   )r   r   r   r   r   )r   r   r8  r   g      ?)r   r   r   r  r  rJ   rk   r   r   r   r:  r;  r<  r=  r   rv   ru   AssertionErrorr   int32)r+   sizesra   r6   r_   r;   r5   r  r   r	  r;  r
  rT  ry   rz   r   rR  r   test_specific_sample_matrixk  st   
z.TestTestLinalgBase.test_specific_sample_matrixN)r   r   r   r   r\  r   r   r   r   rD  e  s    rD  c                   @   (   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
        r8  Tr   c                    s   t | } | }|d d}ztjj||dd W n ty&   d}Y nw |r4t|| }|    |  W d    d S 1 sHw   Y  d S )Nr`   Fr8  nulpT)	r   r.  r   r<  assert_array_almost_equal_nulprY  r   r@  rU   )r   kwargsrY   rZ   use_reconstructionrecrW   r+   r   r   check  s"   




"z,TestLinalgInv.test_linalg_inv.<locals>.checkr   r   r   r   r   r   r   r\   N)r   r   r   r   r  r   rc   r  onesr#  rZ  r*  r5  r  )r+   r5   rf  r6   r_   r   r   re  r   test_linalg_inv  s   
zTestLinalgInv.test_linalg_invc                 C      t jg dg dg dg dgdd}t |}tddd	d
 }||d}t j|| ||d}t j|| t j|| d S )Nr   r   r   rG  r   r   r   	   rX  r   r   r   r6  r      r`   r^   Tr   c                 S   $   |r| ddd d f } t j| S Nr   r   r   Xtestr   r   r   ainv     z2TestLinalgInv.test_no_input_mutation.<locals>.ainvFr   r  rr   r   r   r<  r=  )r+   rv  X_origrx  rY   rZ   r   r   r   test_no_input_mutation     



z$TestLinalgInv.test_no_input_mutationN)r   r   r   r   r   rj  r|  r   r   r   r   r^    s    
2r^  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   r0   r   r   diagr  )	r+   r;   r6   r_   r   qr  Lr  r   r   r   r<   %  s   z TestLinalgCholesky.sample_matrixc                 C   r  )Nz Matrix is not positive definite.r  r  r   r   r   assert_not_pd1  r  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
        r8  Tr   c                    s   t | } | }d}|d ztjj||dd W n ty&   d}Y nw |rFt|t|j}dt	| j
j }tjj| |||d    |  W d    d S 1 sZw   Y  d S )NFr]   r8  r_  Tr7  rO  )r   r.  r   r<  ra  rY  r   conjr   r:  r6   r;  r=  rU   )r   rY   rZ   rc  rd  r;  re  r   r   rf  =  s.   



"z6TestLinalgCholesky.test_linalg_cholesky.<locals>.checkrM  rg  r   r   r\   rh  r   r   N)r   r   r   r   r<   r   rc   r  ri  r   r#  rZ  r*  r  r:   )r+   r5   rf  r6   r_   r   rnr   re  r   test_linalg_cholesky5  s$   
z'TestLinalgCholesky.test_linalg_choleskyN)r   r   r   r   r<   r  r   r  r   r   r   r   r~     s    r~  c                   @   sp   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   r   r   )r8   r   r  r  r  rk   r  )r+   r;   r6   r_   vr  r  r   r   r   r<   x  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r)d}t| n|j |d d}tt|D ]}ztj	j
|| || dd W q> tyZ   d}Y q>w dt|jj }|r|r|\}}	d d	krt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|	rtj	j|j|j||d ntj	jt|t|||d    |   W d    d S 1 sw   Y  d S )Nr   FTr`   r8  r_  r7  r   hr   rO  )r   rJ   rD   r  r-  ndimr.  re   r   r<  ra  rY  r:  r6   r;  r  r  rk   r  realr  diag_indicesr   r=  iscomplexobjimagsortrU   )rX   rY   rZ   r   res_is_tuplerc  r   r;  rQ   r  idxlidxulhsrhsrW   expected_res_lenr"  r+   r   r   rf    sl   


   


$z3TestLinalgEigenSystems._check_worker.<locals>.checkr   )r+   rW   r"  r  check_for_domain_changerf  r   r  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 ]F}|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 q-|rtddgddgg}||tj ||\}}| t|j tjtjfD ]}| ||||f qdS dS )z$
        Test np.linalg.eig
        r8  Tr   rM  rg  r\   r   rh  r          @r   r6  r   N)r   r  r   r   r<   r   r   r   rc   r  ri  r#  rZ  r*  r,  r  infnanr3   r   r0  anyr  r   r  )r+   r"  funcr  r  r5   rW   rf  r6   r_   r   tyr   lr  r   r   r   checker_for_linalg_eig  s:   

z-TestLinalgEigenSystems.checker_for_linalg_eigc                 C      |  dtdd d S )Nr   r   T)r  r   r*   r   r   r   test_linalg_eig%     z&TestLinalgEigenSystems.test_linalg_eigc                 C   r  )Nr   r   T)r  r   r*   r   r   r   test_linalg_eigvals)  r  z*TestLinalgEigenSystems.test_linalg_eigvalsc                 C   r  )Nr   r   F)r  r   r*   r   r   r   test_linalg_eigh-  r  z'TestLinalgEigenSystems.test_linalg_eighc                 C   r  )Nr   r   F)r  r   r*   r   r   r   test_linalg_eigvalsh1  r  z+TestLinalgEigenSystems.test_linalg_eigvalshc              
      s   dD ]w}|\}}}t tj| tdd fdd}| ||||}tjtjfD ]P}| j |d? tjg dg dg d	g d
gd|d}t	|}	|
|d}
tj||	 ||d}tj||	 ||d W d    n1 ssw   Y  q(qd S )N))r   r   T)r   r   T)r   r   F)r   r   FTr   c                    s    |r| ddd d f }  | S rt  r   ru  methr   r   r  B  s   z;TestLinalgEigenSystems.test_no_input_mutation.<locals>.func)r  r6   )rP  r   r   r   )r   rp  r   r   )r   r   rr  r   )r   r   r   rG  r`   )r_   r6   F)getattrr   r   r   r  r   r   subTestr  rr   r   r<  r=  )r+   cr;   noutdomain_changer  rf  r6   rv  r{  rY   rZ   r   r  r   r|  5  s2   



z-TestLinalgEigenSystems.test_no_input_mutationr   )r   r   r   r   r<   r  r  r  r   r  r  r  r  r|  r   r   r   r   r  s  s"    a
>



r  c                   @   r]  )TestLinalgSvdz"
    Tests for np.linalg.svd.
    c                    s   t ddt  fdd}g d}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} | qedS )z$
        Test np.linalg.svd
        Tr   c              	      st  t | fi |} | fi |}t|t| t|d |d d}tt|D ]}ztjj|| || dd W q0 tyL   d}Y q0w |r|\}}}tt|D ]}|| j	|| j	 qZt
|j	d |j	d f}	t|	| tt||	|}
t| jj}tjj| |
d| d	| d
    | fi | W d    d S 1 sw   Y  d S )Nr   r`   Fr8  r_  Tr   r   r9  rO  )r   rJ   rD   r.  re   r   r<  ra  rY  rk   r  fill_diagonalr   r:  r6   r;  r=  rU   )r   rb  rY   rZ   rc  r   ur  vtsrd  r;  re  r   r   rf  l  s>   


"z,TestLinalgSvd.test_linalg_svd.<locals>.check)rF  )rG  r7  )r7  rG  rK  rL  )TFrM  )r   r   rh  r\   r8  r   r  r   r   r   r   rg  N)r   r   r   r   r  r#  r   ri  rZ  r*  r   r,  r  r  r  rc   rB  )r+   rf  r[  r   ra   r6   fmatr_   r   r  szrX   r   re  r   test_linalg_svde  s0   8zTestLinalgSvd.test_linalg_svdc                 C      t jg dg dg dg dgdd}t |}tddd	d
 }||d}t j|| ||d}t j|| t||D ]\}}t j|| q?d S )Nrl  rm  ro  rq  r`   r^   Tr   c                 S   rs  rt  r   ru  r   r   r   r    ry  z2TestLinalgSvd.test_no_input_mutation.<locals>.funcFr   r  rr   r   r   r<  r=  zipr+   rv  r{  r  rY   rZ   e_ag_ar   r   r   r|    "   



z$TestLinalgSvd.test_no_input_mutationN)r   r   r   r   r   r  r|  r   r   r   r   r  `  s    
]r  c                   @   r]  )TestLinalgQrz!
    Tests for np.linalg.qr.
    c           	         s   t ddt  fdd}g d}t|j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|f q_dS )z#
        Test np.linalg.qr
        Tr   c           
   	      s^  t | fi |} | fi |}t|t| t|d |d d}tt|D ]}ztjj|| || dd W q0 tyL   d}Y q0w |r|\}}tt|D ]}|| j	|| j	 qYt
||}t| jj}	tjj| |d|	 d|	 d t
t|j|    | fi | W d    d S 1 sw   Y  d S )	Nr   r`   Fr8  r_  Tr9  rO  )r   rJ   rD   r.  re   r   r<  ra  rY  rk   r   r:  r6   r;  r=  r@  	conjugater   rU   )
r   rb  rY   rZ   rc  r   r  rrd  r;  re  r   r   rf    s<   

"z*TestLinalgQr.test_linalg_qr.<locals>.checkrE  rM  r   rh  r\   r8  r   r  r  N)r   r   r   r   r  r#  r   ri  rZ  r*  r   r,  r  r  r  rB  rc   )	r+   rf  r[  ra   r6   r_   r   r  r  r   re  r   test_linalg_qr  s,   7
zTestLinalgQr.test_linalg_qrc                 C   r  )Nrl  rm  ro  rq  r`   r^   Tr   c                 S   rs  rt  r   ru  r   r   r   r  D  ry  z1TestLinalgQr.test_no_input_mutation.<locals>.funcFr  r  r   r   r   r|  ;  r  z#TestLinalgQr.test_no_input_mutationN)r   r   r   r   r   r  r|  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   r%  )Nr&  r   z*%s.%s() only supported on 1 and 2-D arraysr   r'  r   r   r   assert_wrong_dimensions_1D\  r+  z,TestLinalgSystems.assert_wrong_dimensions_1Dc                 C   r  )Nz<Incompatible array sizes, system is not dimensionally valid.r  r  r   r   r   assert_dimensionally_invalidb  r  z.TestLinalgSystems.assert_dimensionally_invalidc                 C   r  )NzAnp.linalg.%s() only supports inputs that have homogeneous dtypes.r   r!  r   r   r   assert_homogeneous_dtypesg  r$  z+TestLinalgSystems.assert_homogeneous_dtypesNrC  )r   r   r   r   r  r  r  r   r   r   r   r  U  s
    
r  c                   @   r]  )TestLinalgLstsqz$
    Tests for np.linalg.lstsq.
    c                    s  t ddt  fddg d}tj}ddg}t|d}fd	d
}|D ]Q}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}	 | qt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
        Tr   c                    s  t | |fi |} | |fi |}t|t| t|d |d d}z/|d |d  tt|D ]}ztjj|| || dd W q= tyY   d}Y q=w W n tyf   d}Y nw |r-|\}}}	}
g d}z#|	|d  |D ]}t	|| tj
r|| j|| j qW n ty   t|	|d  dk  Y nw t| jj}zt| |}tjj||d| d| d	 W na ty,   |D ]T}ztjj|| || d
| d
| d	 W n ty   tj| }d| d|  Y nw tj|t| |d  }tj|t| | }tjj||dd qY nw    | |fi | W d    d S 1 sGw   Y  d S )Nr   r]   Fr   r8  r_  T)r   r   r   rO  r9  r   r   rP  r>  )r   rJ   rD   r.  re   r   r<  ra  rY  r  ndarrayrk   r0  absr:  r6   r;  r   r=  r   r   assertGreaterr   rU   )r   r   rb  rY   rZ   rc  r   xresr	  r  out_array_idxr;  rd  r  res_expectedres_gotre  r   r   rf    s   



$z0TestLinalgLstsq.test_linalg_lstsq.<locals>.checkrE  r`   r]   rP  c                    sv   d}|D ]4}t }| jd |f||} | |fi | t }|d d df j|d} | |fi | qd S )Nr      r   r^   )nextr  rk   rr   )r   dtrb  b_sizesb_sizeb_orderr   rn   )rf  cycle_orderr+   r   r   inner_test_loop_fn  s   z=TestLinalgLstsq.test_linalg_lstsq.<locals>.inner_test_loop_fnr   rN  rQ  r   r   r  rV  r  r   r   r   r        @      @r\   r   r   r   r   r7     rG  rr  N)r   r   r   r   r  r  r  r   rc   rB  r  r   rZ  r#  r   r  r*  r  r  r,  r  r  )r+   r[  cycle_dtordersspecific_condr  a_sizer  a_orderr   r;   r5   r  r  r   approx_half_rank_rcondemptiesr   rX   okr  badoneDbad1Dbad2Dr   )rW   rf  r  r+   r   test_linalg_lstsqz  sx   \



 ,z!TestLinalgLstsq.test_linalg_lstsqc                 C   sz   t jg dg dg dg dg dg dgdd}t |}t g d	}td
ddd }|||d t j|| d S )N)r   g)\(@gGz@)r   g@r  )r   g      @gffffff@)r   gffffff?g(\@)r   gzG@g)\(
@)r   g(\?g@r`   r^   )r   r  r  r        @g      @Tr   c                 S   &   |r| ddd d f } t j| |S rt  r   rv  yrw  r   r   r   f2i     z*TestLinalgLstsq.test_issue3368.<locals>.f2F)r   r  rr   r   r<  r=  )r+   rv  r{  r  r  r   r   r   test_issue3368]  s   


zTestLinalgLstsq.test_issue3368N)r   r   r   r   r   r  r  r   r   r   r   r  l  s    
 cr  c                   @   r]  )TestLinalgSolvez$
    Tests for np.linalg.solve.
    c                    s  t ddt  fdd}g d}t|jdD ]:\}}}|||}d}t|dD ]&\}}	|jd |f||	}
|||
 |
d	d	df j|	d
}||| q,q 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
        Tr   c                    s   t | |fi |} | |fi |}|d d}ztjj||dd W n ty0   d}Y nw |rV|j|j t| |}t	| j
j}tjj||d| d| d    | |fi | W d    d S 1 sow   Y  d S )Nr`   Fr8  r_  Tr9  rO  )r   r.  r   r<  ra  rY  rJ   rk   r   r:  r6   r;  r=  rU   )r   r   rb  rY   rZ   rc  rd  r;  re  r   r   rf    s0   

"z0TestLinalgSolve.test_linalg_solve.<locals>.check)r  rK  rG  rG  rM  r  r   Nr^   rg  r  r           r\   r   r   r   r   r   r  r7  r  rG  rr  r  rh  r]   rN  )r   r   r   r   r  rk   rr   r   rc   r  r   rZ  r#  r   r  r*  r  r  r,  r  r  r5  )r+   rf  r[  ra   r6   r_   r   r  r  r  r   rn   r  r  r  ok_oneDr  r  r   re  r   test_linalg_solvey  sP   +

 
,z!TestLinalgSolve.test_linalg_solvec                 C   s   t jg dg dg dg dgdd}t |}t g d}t |}tdd	d
d }|||d}t j|| t j|| |||d}t j|| t j|| t j|| d S )N)r   r   r   r   )r  r   r   r   )r  r   r   r   )r   r   r   r   r`   r^   )r   r  r  r   Tr   c                 S   r  rt  r   r  r   r   r   r    r  z4TestLinalgSolve.test_no_input_mutation.<locals>.funcFrz  )r+   rv  r{  r  y_origr  rY   rZ   r   r   r   r|    s&   



z&TestLinalgSolve.test_no_input_mutationN)r   r   r   r   r   r  r|  r   r   r   r   r  t  s    
tr  c                   @   r]  )TestLinalgPinvz#
    Tests for np.linalg.pinv.
    c                    s*  t ddt  fdd}g d}d}t|jdD ]8\}}}|||}|| |\}}	|dkrS|	dkrSt||	}
j||||d	}d
| }|
| }|||d qdD ]	}|t| qVd}| 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
        Tr   c           	   	      s  t | fi |} | fi |}|d d}ztjj||dd W n ty.   d}Y nw |r|j|j t|| }z	| W nd ty   dt
| jj } |}tjj|| d| d| d | jd	 | jd
 krtddt}|| t| jd	 | jfi |d	 }tjj||d| d| d tj|| | Y nw    | fi | W d    d S 1 sw   Y  d S )Nr`   Fr8  r_  Tr7  r9  rO  r   r   r   )r   r.  r   r<  ra  rY  rJ   rk   r   r@  r:  r6   r;  r=  r   r   r  r3   
assertLessr   r   rU   )	r   rb  rY   rZ   rc  rd  r;  r   
lstsq_pinvre  r   r   rf    sd   


"z.TestLinalgPinv.test_linalg_pinv.<locals>.checkrE  rP  rM  r   rQ  r   r  )r  r  r   rh  r\   r8  r  N)r   r   r   r   r  r  r   rc   r#  ri  rZ  r*  r   r,  r  r  r  )r+   rf  r[  r  ra   r6   r_   r   r;   r5   r  r   r  r  r  r   re  r   test_linalg_pinv  s@   D

zTestLinalgPinv.test_linalg_pinvc                 C   s   t dddd }tjg dg dg dg dgd	d
}t|}|d}||}tj|| ||}tj|| tj|| d S )NTr   c                 S   s   t j| d S )Nr   r   )r  r   r   r   some_fn  s   z.TestLinalgPinv.test_issue5870.<locals>.some_fnrl  rm  ro  rq  r`   r^   )r   r   r   )r   r   r  rr   r:   r   r<  r=  )r+   r   v_datav_orig
reshaped_vrY   rZ   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i |}||fi |}dt|jj }tjj|||d |   ||fi | W d    d S 1 s:w   Y  d S Nr7  r  )r   r   r:  r6   r;  r<  r=  rU   )r+   rW   r   rb  rY   rZ   r;  r   r   r   	check_det  s   
"z!TestLinalgDetAndSlogdet.check_detc           	      K   s  t |fi |}||fi |}| t|t| | t|d tdD ]}| t|| t||  q&|j|d }tjj	||d dd dt
|jj }tjj|d |d ||d |   ||fi | W d    d S 1 s{w   Y  d S )Nr   r   r8  r_  r7  r   rO  )r   rJ   rD   re   r   r  r6   typer<  ra  r:  r;  r=  rU   )	r+   rW   r   rb  rY   rZ   r   got_convr;  r   r   r   check_slogdet  s(   

"z%TestLinalgDetAndSlogdet.check_slogdetc           	      C   s   g d}t || jdD ]\}}}| |||}||| qt | jdD ]\}}tjd|d}||| q#||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 )
N)r  )r   r   r  rM  rK  r\   rg  rh  r8  r   r  )r   r   r  r   r  rc   r#  ri  rZ  r*  r   r,  r  r  r  )	r+   r  rf  rW   r[  ra   r6   r_   r   r   r   r   do_test  s(   zTestLinalgDetAndSlogdet.do_testc                 C   "   t ddt}| d| j| d S )NTr   r   )r   r   r  r  r+   rW   r   r   r   test_linalg_det     z'TestLinalgDetAndSlogdet.test_linalg_detc                 C   r  )NTr   r   )r   r   r  r
  r  r   r   r   test_linalg_slogdet  r  z+TestLinalgDetAndSlogdet.test_linalg_slogdetc                 C   rk  )Nrl  rm  ro  rq  r`   r^   Tr   c                 S   rs  rt  r   ru  r   r   r   r    ry  z<TestLinalgDetAndSlogdet.test_no_input_mutation.<locals>.funcFrz  r+   rv  r{  r  rY   rZ   r   r   r   r|    r}  z.TestLinalgDetAndSlogdet.test_no_input_mutationN)r   r   r   r   r  r
  r  r   r  r  r|  r   r   r   r   r    s    #!

r  c                   @      e Zd ZdZedd ZdS )TestLinalgNormz#
    Tests for np.linalg.norm.
    c           
         sz  t ddt  fdd}g d}dtjtj ddd	d
ddddg}t|j|D ]\}}}||}|||d q)tj|D ]\}}d|ddd }|||d qAg d}dtjtj dd	d
dg}t|jd|D ]\}}}}|||}|||d qodg}tj|dD ]1\}}}d||}||dd |d ||ddddf |d ||ddddf |d qtj|dD ]'\}}}tjd||d}	 ||d tjd||d}	 ||d qd}	
|	 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
        Tr   c                       t | fi |} | fi |}t|  dt| jj }tjj|||d 	   | fi | W d    d S 1 sCw   Y  d S r  )
r   r0  r   r  r:  r6   r;  r<  r=  rU   r   rb  rY   rZ   r;  re  r   r   rf  '     
"z.TestLinalgNorm.test_linalg_norm.<locals>.check)r   r   rG  Nr   r   r   r   r6  r7  g@g333333)r   r8  r   rE  rM  )   r  r   r  r   r  rg  r   rh  r\      r   r  r  r  r  )r   r   r   r  r   r   r8   r  rc   rJ   r#  ri  rZ  r  r   r:   r,  r  r  rA  )
r+   rf  r[  	nrm_typesra   r6   nrm_typer   r_   r  r   re  r   test_linalg_norm   sp    


zTestLinalgNorm.test_linalg_normN)r   r   r   r   r   r  r   r   r   r   r        r  c                   @   r  )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 q&g d}t|jdD ]\}}}|||}|| qEdD ]}	 t|	f qXt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   tj	ddgddggtj
d}tdt || W d   n1 sw   Y  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
        Tr   c                    r  r  )
r   r0  r   r  r:  r6   r;  r<  r=  rU   r  re  r   r   rf    r  z.TestLinalgCond.test_linalg_cond.<locals>.checkNr   r   r   r6  rK  r  rM  )r   )rF  rH  rJ  rL  r  r   r\   gg?ignorer   rh  r8  r   r  r  r  r  )r   r   r   r  r   r   r  rB  rc   r  r   r?   r@   rA   RuntimeWarningr#  ri  rZ  r*  r,  r  rA  )r+   rf  psr[  ra   r6   r_   r   r   r  r  r  r   re  r   test_linalg_cond  sT   



zTestLinalgCond.test_linalg_condN)r   r   r   r   r   r!  r   r   r   r   r    r  r  c                   @   r]  )TestLinalgMatrixRankz*
    Tests for np.linalg.matrix_rank.
    c              	      s  t ddt  fdd}g d}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 q4d
|ddddf<  |d || t	|rd|d< nd|d<  ||d |||d qjD ]%}t	jd|d} |d || d|d<  |d || qdD ]}dD ]} t	||f q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f dS )z,
        Test np.linalg.matrix_rank
        Tr   c                    sl   t | fi |} | fi |}tj||    | fi | W d    d S 1 s/w   Y  d S r   )r   r   r<  r=  rU   )r   rb  rY   rZ   re  r   r   rf    s   
"z;TestLinalgMatrixRank.test_linalg_matrix_rank.<locals>.checkrE  rM  vIh%<=r   rN  r  Nr                 ?y+=+=r   g+=)r   )r   r   r7  r\   r  )Nr#  r   rh  r  r   r   r  )r   r   r   r   r  re   r  rJ   rk   r   r  r  r  r   r  r3   r  rB  rc   r#  ri  rZ  r  r   r:   r,  r  r  r  )r+   rf  r[  ra   r6   r_   r   r   r   r;   r5   r  r   r  r  r  r   re  r   test_linalg_matrix_rank  s|   


*



z,TestLinalgMatrixRank.test_linalg_matrix_rankc                 C   rk  )Nrl  rm  ro  rq  r`   r^   Tr   c                 S   rs  rt  r   ru  r   r   r   r  O	  ry  z9TestLinalgMatrixRank.test_no_input_mutation.<locals>.funcFrz  r  r   r   r   r|  B	  s   



z+TestLinalgMatrixRank.test_no_input_mutationN)r   r   r   r   r   r%  r|  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   sH   ||d d |  tj ||  W d    d S 1 sw   Y  d S )Nr   r   ru   r	   r}   )r+   rW   rX   r   r   r   assert_int_exponenentd	  s   
"z+TestLinalgMatrixPower.assert_int_exponenentc                    sL  t ddt  fdd}g d}ddgttdd	 d
dg }t||jdD ]\}}}}|||}||| tjd||d}||| q)d}		|	 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 )NTr   c                    s~   t | |} | |}|d dt| jj }tjj||||d    | | W d    d S 1 s8w   Y  d S )Nr]   r7  rO  )	r   r.  r   r:  r6   r;  r<  r=  rU   )r   pwrrY   rZ   r  re  r   r   rf  o	  s   


"z=TestLinalgMatrixPower.test_linalg_matrix_power.<locals>.check)r  r7  r7  r  iir8  r  !   rM  rg  r   r   rh  r\   r   )r   r7  zinput must be a square array333333?r  r   r   )r   r   listre   r   r   r  r   rc   r#  ri  rZ  r  r*  r   r(  r5  r  )r+   rf  r[  powersra   r)  r6   r_   r   r  rX   rz   r   re  r   test_linalg_matrix_powerk	  s2   
&z.TestLinalgMatrixPower.test_linalg_matrix_powerN)r   r   r   r   r(  r   r0  r   r   r   r   r&  _	  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 )NTr   )superr1  r,   r   r   cfunc_w_offsetr   cfunc_no_offsetr*   	__class__r   r   r,   	  s   zTestTrace.setUpc                 K   sJ   || |  tj ||fi | W d    d S 1 sw   Y  d S r   r'  )r+   rW   r   rb  r   r   r   assert_int_offset	  s   "zTestTrace.assert_int_offsetc           
         s   fdd}g d}g dt tdd g d }t|| jdD ]1\}}}} |||}|||d	 |d
kr<|| tjd||d}|||d	 |d
krR|| q!d}	 |	 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|v rt | fi |} j}nt| fi |} j}|| fi |}dt| jj }tjj	||||d  
  || fi | W d    d S 1 sNw   Y  d S )Nr   r7  rO  )r   r3  r   r4  r   r:  r6   r;  r<  r=  rU   )r   rb  rY   rW   rZ   r  r*   r   r   rf  	  s   
"z#TestTrace.test_trace.<locals>.checkrE  )iiir+  r8  )rI  r  r  rM  )r   r   rg  r   r   r\   r   Frh  r-  )r.  re   r   r   r  r   rc   r*  r3  ri  r   r4  r7  )
r+   rf  r[  offsetsra   r   r6   r_   r   r  r   r*   r   
test_trace	  s6   


zTestTrace.test_tracec                 C   sx   t ddddd }tjdtjd}|| | t}|d W d   n1 s*w   Y  t|j}| d	| dS )
z
Issue 2314z(optional(float64[:,:]),)Tr   c                 S   r   r   r   r   r   r   r   tested	  s   
z5TestTrace.test_trace_w_optional_input.<locals>.testedr*  r\   Nz(expected array(float64, 2d, A), got None)	r   r   ri  r   ru   	TypeErrorrH   rw   rJ   )r+   r:  r   ry   errmsgr   r   r   test_trace_w_optional_input	  s   



z%TestTrace.test_trace_w_optional_input)	r   r   r   r   r,   r7  r9  r=  __classcell__r   r   r5  r   r1  	  s    2r1  c                   @   sT   e Zd Zeg dZeg dZg dZdd Zdd Zdd	 Z	d
d Z
dd ZdS )
TestBasics)r`   r]   r]   r`   )r]   r`   r]   r`   )rF  rK  rL  )rG  rV  )r   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   r\   F)r  r   r  r   ri  )r+   r  rW   r   r   r   _assert_wrong_dim	  s   $$zTestBasics._assert_wrong_dimc                 C   sL   t |ts|S t|dkr| |d |S | |d |d  |j||dS )Nr   r   r^   )r  r-  rD   r8   r:   )r+   ra   r6   r_   r   r   r   
_gen_input
  s   
zTestBasics._gen_inputc                 C   sT   |  ||t| j}|  ||t| j}t|r|d }t|r&|d }||fS )Nr$  )rA  r  order1order2r   r  )r+   size1size2r6   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 ]2\}}t|}|||\}}||| tj	t
|jt
|jft
|jd}||||d qd  d S )NTr   c                    s   t | |} | |}dtt| jj }tjj||||d d|v rC | |fi |}tjj||||d tjj|d |||d    | |fi | W d    d S 1 s\w   Y  d S )Nr7  rO  r    )	r   r   r:  asarrayr6   r;  r<  r=  rU   r   r   rb  rY   rZ   r  re  r   r   rf  
  s   


"z$TestBasics.test_outer.<locals>.checkr\   r   r   )r   r   r   r   r   r[  r  rF  r   rc   rG  ra   r6   r@  )	r+   rf  dtsrD  rE  r6   r   r   r  r   re  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 )
NTr   c                    sx   t | |} | |}dtt| jj }tjj||||d    | | W d    d S 1 s5w   Y  d S )Nr7  rO  )	r   r   r:  rG  r6   r;  r<  r=  rU   rH  re  r   r   rf  A
  s   


"z#TestBasics.test_kron.<locals>.checkr   r8  r   zonly supports 'C' or 'F' layoutr4  )r   r   r   r[  r   rF  r@  r   rc   r  r	   r}   )	r+   rf  rD  rE  r6   r   r   rX   rz   r   re  r   	test_kron>
  s   (zTestBasics.test_kronN)r   r   r   r   rB  rC  r[  r@  rA  rF  rJ  rK  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 ](\}}}tt|j||d}| |}	 |||	  |jj|	jj qd S )Nr^   )	r   r   r0   prodr:   rV   assertNotEqualctypesdata)
udtexpectfnshapesr   r  rk   r6   r_   r   r  r*   r   r   rf  ]
  s   z5TestHelpers.test_copy_to_fortran_order.<locals>.checkc                    s    | S r   r   r   rM  r   r   direct_callg
  s   z;TestHelpers.test_copy_to_fortran_order.<locals>.direct_call)r   r   )r   r   r7  r]   r`   c                    s   | d d d d } |S Nr   r   r   r   slicedrM  r   r   slice_to_anyq
  s   z<TestHelpers.test_copy_to_fortran_order.<locals>.slice_to_any)r   r   r   )r   r   r   r7  c                 S   s   | d d d d }t |S rW  )r   asfortranarrayrX  r   r   r   expected_slice_to_any{
  s   
zETestHelpers.test_copy_to_fortran_order.<locals>.expected_slice_to_any)numba.np.linalgrN  r   r   intpr[  )r+   rf  rV  rU  r   r  rZ  r\  r   )rN  r+   r   test_copy_to_fortran_orderZ
  s   
z&TestHelpers.test_copy_to_fortran_orderN)r   r   r   r_  r   r   r   r   rL  Y
  s    rL  __main__rV  )r   )r   r   r  )Ir   r(   	itertoolsr   r   sysr?   numbersr   r   platformnumpyr   numbar   r   r   
numba.corer	   numba.tests.supportr
   r   r   r   r   r   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   rD  r^  r~  r  r  r  r  r  r  r  r  r  r  r"  r&  r1  r?  rL  r   mainr   r   r   r   <module>   s      0







 EjQS n}x  
  iT BTd
)