o
    ibw                    @   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-dgd/d0Z.dgd1d2Z/d3d4 Z0dhd5d6Z1d7d8 Z2dgd9d: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rgeI  dS dS )i    N)productcycle)NumberIntegral)jitnjittypeof)errors)TestCasetagneeds_lapack
needs_blas
_is_armv7lEnableNRTStatsMixin   )matmul_usecasec                 C      t | |S Nnpdotab r   T/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/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	 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                       t   tt|   d S r   )gccollectsuperr&   setUpself	__class__r   r   r+   &      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   )r;   reshape)r-   mr8   r9   r   r   r   sample_matrix4   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_warning7   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-   rS   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	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   r9   zCould not obtain aligned arrayCorderF)sizeitemsizer   emptyuint8rangeviewr9   flagsaligned	Exceptionc_contiguousr=   shape)r-   arrrd   datasizetmpinewr   r   r   _aligned_copyN   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!   TrV   )r   rt   r   copyrX   rH   rY   )r-   rS   rZ   r[   r!   copierr\   r]   r   r   r   check_func_outc   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
ValueErrorrJ   rK   	exception)r-   rZ   r[   is_outraisesmsgr   r   r   assert_mismatching_sizesm   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)rx   r	   TypingErrorrJ   rK   rz   )r-   rZ   r[   	func_namer|   r   r   r   assert_mismatching_dtypest   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   dtypesr;   r^   r   float64r~   float32r   )r-   rS   r   r8   rZ   r9   r   r   r   r   r   check_dot_vv{   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CFra   r   )r?   r   r   ru   r;   r   )r>   r8   rb   r   r   r9   r,   r   r   samples   s   
"z)TestProduct.check_dot_vm.<locals>.samplesTr   )   r   )r   r   )r   r   r_   r   r   r{   )r   r^   Tr   rf   r9   rw   r?   r   r;   r~   r   r   )r-   pyfunc2pyfunc3r   r   cfunc2cfunc3r>   r8   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   ru   r   )r>   r8   korder_aorder_br   r   r9   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   rf   r9   rw   r?   r   r~   r   r   )r-   r   r   r   r   r   r   r>   r8   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?   rf   r   r   rU   py_funcr#   r;   r%   )	r-   r>   r   r8   r9   r   r   r!   rZ   r   r   r   test_contiguity_warnings5  s&   
"z$TestProduct.test_contiguity_warnings)F)r   )"__name__
__module____qualname____doc__r   r   r   
complex128	complex64r   r+   r;   r?   
contextlibcontextmanagerrU   r^   rt   rw   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   r   r.   r   r&      s@    	





8
>



r&   c                 C      t j| S r   r   linalginvr   r   r   r   invert_matrixN  r   r   c                 C   r   r   )r   r   choleskyr   r   r   r   cholesky_matrixR  r   r   c                 C   r   r   )r   r   eigr   r   r   r   
eig_matrixV  r   r   c                 C   r   r   )r   r   eigvalsr   r   r   r   eigvals_matrixZ  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_matrixb  r   r   c                 C      t j| |S r   r   r   svd)r   full_matricesr   r   r   
svd_matrixf     r   c                 C   r   r   r   r   qrr   r   r   r   	qr_matrixj  r   r   r   c                 C   s   t j| ||S r   r   r   lstsq)ABrcondr   r   r   lstsq_systemn  r$   r   c                 C   r   r   r   r   solve)r   r   r   r   r   solve_systemr  r   r   V瞯<c                 C   r   r   r   r   pinv)r   r   r   r   r   pinv_matrixv  r   r   c                 C   r   r   r   r   slogdetr   r   r   r   slogdet_matrixz  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   r8   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	 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                    r'   r   )r(   r)   r*   r   r+   r,   r.   r   r   r+     r0   zTestLinalgBase.setUpc                 C   s:   t |}t|t jr|d d |S |d d |S r1   r2   r7   r   r   r   r;     r<   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.)rc   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   r9   rb   )rG   ry   r   r   r   r   r   randomseedmin
isinstancer   maxr;   r=   r   r   linspacezerosnonzeroeyer   r   array)r-   rd   r9   rb   rank	conditiond_condr>   r8   minmnrvmaxmnQrq   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   )rx   rJ   rK   rz   )r-   rZ   r[   r}   errr|   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-   rZ   r[   r}   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-   namerZ   r[   r}   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&  rZ   r[   	la_prefixprefixr}   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`   rc   zUnknown contigN)	r  tupleassert_contig_sanityr   rj   rm   f_contiguous
assertTruery   )r-   r]   expected_contigr   c_contigf_contigr}   r   r   r   r2  "  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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   )	rM   rn   r   r  r9   finfo
resolutiontestingassert_allclose)r-   r]   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  ry   r   r   r   r   assert_invalid_norm_kind[  s   z'TestLinalgBase.assert_invalid_norm_kindc                 C   r  )NzArrays cannot be emptyr  r   r   r   r   assert_raise_on_emptyb  r"  z$TestLinalgBase.assert_raise_on_empty)NNT)r   r   r   r   r   r   r   r   r   r   r+   r;   r  ry   r  r!  r'  r.  r0  r2  r9  rD  rE  rF  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 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      r;  r;  rM  r   r   r   rK  FCr   r  r;  r   rB  rC        $@r  c                    sJ    |} j|   W d    n1 sw   Y  |t|j d S r   )rx   r  rJ   rK   rz   )r[   r}   r  r|   instr-   r   r   check_error  s   zCTestTestLinalgBase.test_specific_sample_matrix.<locals>.check_errorblankr   rc   r8  r   r   r   zr   r   r   r   r   )r   r   r   r   r  )r   r   r<  r   g      ?)r   r   r   r  r  rM   rn   r   r   r   r>  r?  r@  rA  r   ry   rx   AssertionErrorr   int32)r-   sizesrd   r9   rb   r>   r8   r  r   r  r?  r  rX  r|   r}   r   rV  r   test_specific_sample_matrixm  st   
z.TestTestLinalgBase.test_specific_sample_matrixN)r   r   r   r   r`  r   r   r   r   rH  g  s    rH  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
        r<  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 )Nrc   Fr<  nulpT)	r   r2  r   r@  assert_array_almost_equal_nulpr]  r   rD  rX   )r   kwargsr\   r]   use_reconstructionrecrZ   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   rf   r!  onesr'  r^  r.  r9  r	  )r-   r8   rj  r9   rb   r   r   ri  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   rK  r   r   r   	   r\  r   r   r   r:  r      rc   ra   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  ru   r   r   r@  rA  )r-   rz  X_origr|  r\   r]   r   r   r   test_no_input_mutation	     



z$TestLinalgInv.test_no_input_mutationN)r   r   r   r   r   rn  r  r   r   r   r   rb    s    
2rb  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   r3   r   r   diagr  )	r-   r>   r9   rb   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_pd3  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
        r<  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`   r<  rc  Tr;  rS  )r   r2  r   r@  re  r]  r   conjr   r>  r9   r?  rA  rX   )r   r\   r]   rg  rh  r?  ri  r   r   rj  ?  s.   



"z6TestLinalgCholesky.test_linalg_cholesky.<locals>.checkrQ  rk  r   r   r_   rl  r   r   N)r   r   r   r   r?   r   rf   r!  rm  r   r'  r^  r.  r  r=   )r-   r8   rj  r9   rb   r   rnr   ri  r   test_linalg_cholesky7  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  )r;   r   r  r
  r  rn   r  )r-   r>   r9   rb   vr  r  r   r   r   r?   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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   FTrc   r<  rc  r;  r   hr   rS  )r   rM   rG   r  r1  ndimr2  rh   r   r@  re  r]  r>  r9   r?  r
  r  rn   r  realr  diag_indicesr   rA  iscomplexobjimagsortrX   )r[   r\   r]   r   res_is_tuplerg  r   r?  rT   r  idxlidxulhsrhsrZ   expected_res_lenr&  r-   r   r   rj    sl   


   


$z3TestLinalgEigenSystems._check_worker.<locals>.checkr   )r-   rZ   r&  r  check_for_domain_changerj  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
        r<  Tr   rQ  rk  r_   r   rl  r          @r   r:  r   N)r   r  r   r   r?   r   r   r   rf   r!  rm  r'  r^  r.  r0  r  infnanr6   r   r4  anyr  r   r  )r-   r&  funcr  r  r8   rZ   rj  r9   rb   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_eigvalsh3  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 rx  r   ry  methr   r   r  D  s   z;TestLinalgEigenSystems.test_no_input_mutation.<locals>.func)r  r9   )rT  r   r   r   )r   rt  r   r   )r   r   rv  r   )r   r   r   rK  rc   )rb   r9   F)getattrr   r   r   r  r   r   subTestr  ru   r   r@  rA  )r-   cr>   noutdomain_changer  rj  r9   rz  r  r\   r]   r   r  r   r  7  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  u  s"    a
>



r  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=  rS  )rh   rG   rM   rn   r   r	  fill_diagonalr   r>  r9   r?  r@  rA  )r-   r   r]   r\   ur  vtr   srh  r?  r   r   r   check_reconstructionm  s   

z"TestLinalgSvd.check_reconstructionc                    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              	      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 |rV	| || 
   | fi | W d    d S 1 snw   Y  d S )Nr   rc   Fr<  rc  T)r   rM   rG   r2  rh   r   r@  re  r]  r  rX   )r   rf  r\   r]   rg  r   ri  r   r   rj    s&   

"z,TestLinalgSvd.test_linalg_svd.<locals>.check)rJ  )rK  r;  )r;  rK  rO  rP  )TFrQ  )r   r   rl  r_   r<  r   r  r   r   r   r   rk  N)r   r   r   r   r  r'  r   rm  r^  r.  r   r0  r  r  r  rf   rF  )r-   rj  r_  r   rd   r9   fmatrb   r   r  szr[   r   ri  r   test_linalg_svd  s0   zTestLinalgSvd.test_linalg_svdc                 C   s   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|| zt||D ]\}}t j|| q@W d S  ty_   | 	||| Y d S w )Nrp  rq  rs  ru  rc   ra   Tr   c                 S   rw  rx  r   ry  r   r   r   r    r}  z2TestLinalgSvd.test_no_input_mutation.<locals>.funcF)
r   r  ru   r   r   r@  rA  zipr]  r  r-   rz  r  r  r\   r]   e_ag_ar   r   r   r    s*   



z$TestLinalgSvd.test_no_input_mutationN)r   r   r   r   r  r   r  r  r   r   r   r   r  b  s    

Cr  c                   @   ra  )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   rc   Fr<  rc  Tr=  rS  )r   rM   rG   r2  rh   r   r@  re  r]  rn   r   r>  r9   r?  rA  rD  	conjugater   rX   )
r   rf  r\   r]   rg  r   r  rrh  r?  ri  r   r   rj    s<   

"z*TestLinalgQr.test_linalg_qr.<locals>.checkrI  rQ  r   rl  r_   r<  r   r  r  N)r   r   r   r   r  r'  r   rm  r^  r.  r   r0  r  r  r  rF  rf   )	r-   rj  r_  rd   r9   rb   r   r  r  r   ri  r   test_linalg_qr  s,   7
zTestLinalgQr.test_linalg_qrc                 C   s   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 )Nrp  rq  rs  ru  rc   ra   Tr   c                 S   rw  rx  r   ry  r   r   r   r  I  r}  z1TestLinalgQr.test_no_input_mutation.<locals>.funcF)r   r  ru   r   r   r@  rA  r  r  r   r   r   r  @  s"   



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_1Da  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_invalidg  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_dtypesl  r(  z+TestLinalgSystems.assert_homogeneous_dtypesNrG  )r   r   r   r   r  r  r  r   r   r   r   r  Z  s
    
r  c                   @   ra  )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   r<  rc  T)r   r   r   rS  r=  r   r   rT  rB  )r   rM   rG   r2  rh   r   r@  re  r]  r  ndarrayrn   r4  absr>  r9   r?  r   rA  r   r   assertGreaterr   rX   )r   r   rf  r\   r]   rg  r   xresr  r  out_array_idxr?  rh  r  res_expectedres_gotri  r   r   rj    s   



$z0TestLinalgLstsq.test_linalg_lstsq.<locals>.checkrI  rc   r`   rT  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   ra   )nextr  rn   ru   )r   dtrf  b_sizesb_sizeb_orderr   rq   )rj  cycle_orderr-   r   r   inner_test_loop_fn  s   z=TestLinalgLstsq.test_linalg_lstsq.<locals>.inner_test_loop_fnr   rR  rU  r   r   r  rZ  r  r   r   r   r        @      @r_   r   r   r   r   r;     rK  rv  N)r   r   r   r   r  r  r  r   rf   rF  r  r   r^  r'  r   r  r.  r  r  r0  r  r  )r-   r_  cycle_dtordersspecific_condr  a_sizer  a_orderr   r>   r8   r  r  r   approx_half_rank_rcondemptiesr   r[   okr  badoneDbad1Dbad2Dr   )rZ   rj  r  r-   r   test_linalg_lstsq  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@rc   ra   )r   r  r  r        @g      @Tr   c                 S   &   |r| ddd d f } t j| |S rx  r   rz  yr{  r   r   r   f2n     z*TestLinalgLstsq.test_issue3368.<locals>.f2F)r   r  ru   r   r@  rA  )r-   rz  r  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                   @   ra  )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 )Nrc   Fr<  rc  Tr=  rS  )r   r2  r   r@  re  r]  rM   rn   r   r>  r9   r?  rA  rX   )r   r   rf  r\   r]   rg  rh  r?  ri  r   r   rj    s0   

"z0TestLinalgSolve.test_linalg_solve.<locals>.check)r  rO  rK  rK  rQ  r  r   Nra   rk  r  r           r_   r   r   r   r   r   r  r;  r  rK  rv  r  rl  r`   rR  )r   r   r   r   r  rn   ru   r   rf   r  r   r^  r'  r   r  r.  r  r  r0  r  r  r9  )r-   rj  r_  rd   r9   rb   r   r  r  r  r   rq   r  r  r  ok_oneDr  r  r   ri  r   test_linalg_solve~  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   rc   ra   )r   r  r  r   Tr   c                 S   r  rx  r   r  r   r   r   r    r  z4TestLinalgSolve.test_no_input_mutation.<locals>.funcFr~  )r-   rz  r  r  y_origr  r\   r]   r   r   r   r    s&   



z&TestLinalgSolve.test_no_input_mutationN)r   r   r   r   r   r  r  r   r   r   r   r  y  s    
tr  c                   @   ra  )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 )Nrc   Fr<  rc  Tr;  r=  rS  r   r   r   )r   r2  r   r@  re  r]  rM   rn   r   rD  r>  r9   r?  rA  r   r   r  r6   
assertLessr   r   rX   )	r   rf  r\   r]   rg  rh  r?  r   
lstsq_pinvri  r   r   rj    sd   


"z.TestLinalgPinv.test_linalg_pinv.<locals>.checkrI  rT  rQ  r   rU  r   r  )r  r  r   rl  r_   r<  r  N)r   r   r   r   r  r  r   rf   r'  rm  r^  r.  r   r0  r  r  r  )r-   rj  r_  r  rd   r9   rb   r   r>   r8   r  r   r  r  r  r   ri  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_fnrp  rq  rs  ru  rc   ra   )r   r   r   )r   r   r  ru   r=   r   r@  rA  )r-   r  v_datav_orig
reshaped_vr\   r]   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 Nr;  r  )r   r   r>  r9   r?  r@  rA  rX   )r-   rZ   r   rf  r\   r]   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   r<  rc  r;  r   rS  )r   rM   rG   rh   r   r  r9   typer@  re  r>  r?  rA  rX   )	r-   rZ   r   rf  r\   r]   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  rQ  rO  r_   rk  rl  r<  r   r  )r   r   r  r   r	  rf   r'  rm  r^  r.  r   r0  r  r  r  )	r-   r  rj  rZ   r_  rd   r9   rb   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-   rZ   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   ro  )Nrp  rq  rs  ru  rc   ra   Tr   c                 S   rw  rx  r   ry  r   r   r   r    r}  z<TestLinalgDetAndSlogdet.test_no_input_mutation.<locals>.funcFr~  r-   rz  r  r  r\   r]   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   r4  r   r  r>  r9   r?  r@  rA  rX   r   rf  r\   r]   r?  ri  r   r   rj  ,     
"z.TestLinalgNorm.test_linalg_norm.<locals>.check)r   r   rK  Nr   r   r   r   r:  r;  g@g333333)r   r<  r   rI  rQ  )   r  r   r  r  r  rk  r   rl  r_      r   r  r  r  r  )r   r   r   r  r   r   r;   r  rf   rM   r'  rm  r^  r  r   r=   r0  r  r  rE  )
r-   rj  r_  	nrm_typesrd   r9   nrm_typer   rb   r  r   ri  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   r4  r   r  r>  r9   r?  r@  rA  rX   r  ri  r   r   rj    r  z.TestLinalgCond.test_linalg_cond.<locals>.checkNr   r   r   r:  rO  r  rQ  )r   )rJ  rL  rN  rP  r  r   r_   gg?ignorer   rl  r<  r   r  r  r  r  )r   r   r   r  r   r   r  rF  rf   r  r   rB   rC   rD   RuntimeWarningr'  rm  r^  r.  r0  r  rE  )r-   rj  psr_  rd   r9   rb   r   r   r  r  r  r   ri  r   test_linalg_cond  sT   



zTestLinalgCond.test_linalg_condN)r   r   r   r   r   r#  r   r   r   r   r    r  r  c                   @   ra  )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@  rA  rX   )r   rf  r\   r]   ri  r   r   rj    s   
"z;TestLinalgMatrixRank.test_linalg_matrix_rank.<locals>.checkrI  rQ  vIh%<=r   rR  r  Nr                 ?y+=+=r   g+=)r   )r   r   r;  r_   r  )Nr%  r   rl  r  r   r   r  )r   r   r   r   r  rh   r  rM   rn   r   r
  r  r  r  r  r6   r	  rF  rf   r'  rm  r^  r  r   r=   r0  r  r  r  )r-   rj  r_  rd   r9   rb   r   r   r   r>   r8   r  r   r  r  r  r   ri  r   test_linalg_matrix_rank  s|   


*



z,TestLinalgMatrixRank.test_linalg_matrix_rankc                 C   ro  )Nrp  rq  rs  ru  rc   ra   Tr   c                 S   rw  rx  r   ry  r   r   r   r  T	  r}  z9TestLinalgMatrixRank.test_no_input_mutation.<locals>.funcFr~  r  r   r   r   r  G	  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   rx   r	   r   )r-   rZ   r[   r   r   r   assert_int_exponenenti	  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`   rK  rS  )	r   r2  r   r>  r9   r?  r@  rA  rX   )r   pwrr\   r]   r  ri  r   r   rj  t	  s   


"z=TestLinalgMatrixPower.test_linalg_matrix_power.<locals>.check)r  r;  r;  r  iir<  r  !   rQ  rk  r  r   rl  r_   r   )r   r;  zinput must be a square array333333?r  r   r   )r   r   listrh   r   r   r  r   rf   r'  rm  r^  r  r.  r   r*  r9  r  )r-   rj  r_  powersrd   r+  r9   rb   r   r  r[   r}   r   ri  r   test_linalg_matrix_powerp	  s2   
&z.TestLinalgMatrixPower.test_linalg_matrix_powerN)r   r   r   r   r*  r   r2  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 )NTr   )r*   r3  r+   r   r   cfunc_w_offsetr   cfunc_no_offsetr,   r.   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-   rZ   r   rf  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   r;  rS  )r   r4  r   r5  r   r>  r9   r?  r@  rA  rX   )r   rf  r\   rZ   r]   r  r,   r   r   rj  	  s   
"z#TestTrace.test_trace.<locals>.checkrI  )iiir-  r<  )rM  r  r  rQ  )r   r   rk  r  r   r_   r   Frl  r/  )r0  rh   r   r   r  r   rf   r.  r4  rm  r   r5  r6  )
r-   rj  r_  offsetsrd   r   r9   rb   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   rm  r   rx   	TypeErrorrK   rz   rM   )r-   r9  r   r|   errmsgr   r   r   test_trace_w_optional_input	  s   



z%TestTrace.test_trace_w_optional_input)	r   r   r   r   r+   r6  r8  r<  r   r   r   r.   r   r3  	  s    2r3  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)rc   r`   r`   rc   )r`   rc   r`   rc   )rJ  rO  rP  )rK  rZ  )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   rm  )r-   r  rZ   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   ra   )r  r1  rG   r;   r=   )r-   rd   r9   rb   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&  )r?  r  order1order2r   r  )r-   size1size2r9   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 )Nr;  rS  r!   )	r   r   r>  asarrayr9   r?  r@  rA  rX   r   r   rf  r\   r]   r  ri  r   r   rj  #
  s   


"z$TestBasics.test_outer.<locals>.checkr_   r    r   )r   r   r   r   r   r_  r  rD  r   rf   rE  rd   r9   r>  )	r-   rj  dtsrB  rC  r9   r   r   r  r   ri  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 )Nr;  rS  )	r   r   r>  rE  r9   r?  r@  rA  rX   rF  ri  r   r   rj  F
  s   


"z#TestBasics.test_kron.<locals>.checkr   r<  r   zonly supports 'C' or 'F' layoutr8  )r   r   r   r_  r   rD  r>  r   rf   r  r	   r   )	r-   rj  rB  rC  r9   r   r   r[   r}   r   ri  r   	test_kronC
  s   (zTestBasics.test_kronN)r   r   r   r   r@  rA  r_  r>  r?  rD  rH  rI  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 )Nra   )	r   r   r3   prodr=   rY   assertNotEqualctypesdata)
udtexpectfnshapesr   r  rn   r9   rb   r   r  r,   r   r   rj  b
  s   z5TestHelpers.test_copy_to_fortran_order.<locals>.checkc                    s    | S r   r   r   rK  r   r   direct_calll
  s   z;TestHelpers.test_copy_to_fortran_order.<locals>.direct_call)r   r   )r   r   r;  r`   rc   c                    s   | d d d d } |S Nr   r   r   r   slicedrK  r   r   slice_to_anyv
  s   z<TestHelpers.test_copy_to_fortran_order.<locals>.slice_to_any)r   r   r   )r   r   r   r;  c                 S   s   | d d d d }t |S rU  )r   asfortranarrayrV  r   r   r   expected_slice_to_any
  s   
zETestHelpers.test_copy_to_fortran_order.<locals>.expected_slice_to_any)numba.np.linalgrL  r   r   intprY  )r-   rj  rT  rS  r   r  rX  rZ  r   )rL  r-   r   test_copy_to_fortran_order_
  s   
z&TestHelpers.test_copy_to_fortran_orderN)r   r   r   r]  r   r   r   r   rJ  ^
  s    rJ  __main__rZ  )r   )r   r   r  )Jr   r(   	itertoolsr   r   sysrB   numbersr   r   platformnumpyr   numbar   r   r   
numba.corer	   numba.tests.supportr
   r   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   rH  rb  r  r  r  r  r  r  r  r  r  r  r  r$  r(  r3  r=  rJ  r   mainr   r   r   r   <module>   s       1







 FjQS n x  
  iT BTd
)