B
     \Y                @   s  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 d dlZd dlZd dlmZ d dlmZmZ d dlmZ dd	lmZmZ dd
lmZmZmZ e dkZyd dl Z!dZ"W n e#k
r   dZ"Y nX e$e"d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/djd#d$Z0d%d& Z1dkd(d)Z2d*d+ Z3dld-d.Z4d/d0 Z5d1d2 Z6dmd3d4Z7dnd5d6Z8dod7d8Z9d9d: Z:dpd;d<Z;d=d> Z<ed?krdqd@dAZ=ndBdA Z=dCdD Z>G dEdF dFeZ?G dGdH dHeZ@G dIdJ dJe?ZAG dKdL dLe?ZBG dMdN dNe?ZCG dOdP dPe?ZDG dQdR dRe?ZEG dSdT dTe?ZFG dUdV dVeFZGG dWdX dXeFZHG dYdZ dZe?ZIG d[d\ d\e?ZJG d]d^ d^eFZKG d_d` d`e?ZLG dadb dbeFZMG dcdd dde?ZNG dedf dfe?ZOG dgdh dheFZPeQdikreR  dS )r    )divisionprint_functionN)productcycle)NumberIntegral)unittest_support)jiterrors)version   )TestCasetag)matmul_usecaseneeds_matmul
needs_blasZarmv7lTFzLAPACK needs Scipy 0.16+c             C   s   t | |S )N)npdot)ab r   6lib/python3.7/site-packages/numba/tests/test_linalg.pydot2   s    r   c             C   s   t j| ||dS )N)out)r   r   )r   r   r   r   r   r   dot3#   s    r   c             C   s   t | |S )N)r   vdot)r   r   r   r   r   r   '   s    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edd Zdd Zdd Zedd Zdd Zed d! Zed"d#d$ Zed%d& Zed'd( Z ed)d* Z!ed+d, Z"d-S )0TestProductz!
    Tests for dot products.
    c             C   s   t   d S )N)gccollect)selfr   r   r   setUp2   s    zTestProduct.setUpc             C   s>   t |}t|t jr(|d d |S |d d |S d S )Ny      ?      y               @g      ?r   )r   arange
issubclasscomplexfloatingastype)r   ndtypebaser   r   r   sample_vector6   s    
zTestProduct.sample_vectorc             C   s   |  || |||fS )N)r(   reshape)r   mr%   r&   r   r   r   sample_matrix?   s    zTestProduct.sample_matrixc          	   c   s   t jdd}t dtj dV  W dQ R X | t|d | |d jtj | 	dt
|d j | |d j|jj | |d j|jjd  dS )zB
        Check performance warning(s) for non-contiguity.
        T)recordalwaysNr   r   zfaster on contiguous arrays)warningscatch_warningssimplefilterr
   ZPerformanceWarningZassertGreaterEquallenassertIscategoryassertInstrmessageassertEqualfilename__code__co_filenamelinenoco_firstlineno)r   pyfuncwr   r   r   check_contiguity_warningB   s    z$TestProduct.check_contiguity_warningc          	   C   s<   |   * || }|| }| j||dd ~~W d Q R X d S )NT)ignore_sign_on_zero)assertNoNRTLeakassertPreciseEqual)r   r=   cfuncargsexpectedgotr   r   r   
check_funcQ   s
    
zTestProduct.check_funcc             C   s   |j d |j d }|j |j }tj|tjd}xBt|jd D ](}||||  j|jd}|jj	r@P q@W t
d|jjrtj||jdd}ntj||jdd}|d d  |d d < |jj	st|S )Nr   )r&   zCould not obtain aligned arrayC)orderF)sizeitemsizer   emptyZuint8rangeZviewr&   flagsZaligned	Exceptionc_contiguousr)   shapeAssertionError)r   ZarrrK   Zdatasizetmpinewr   r   r   _aligned_copyY   s    zTestProduct._aligned_copyc          	   C   sx   t r
| jntj}|  V ||}||}| ||d|i| | ||d|i| | j||dd ~~W d Q R X d S )Nr   T)r@   )
_is_armv7lrW   r   copyrA   r2   rB   )r   r=   rC   rD   r   ZcopierrE   rF   r   r   r   check_func_outn   s    
zTestProduct.check_func_outFc          	   C   s@   |  t}||  W d Q R X |r&dnd}| |t|j d S )Nzincompatible output array sizezincompatible array sizes)assertRaises
ValueErrorr4   r5   	exception)r   rC   rD   is_outraisesmsgr   r   r   assert_mismatching_sizesx   s
    z$TestProduct.assert_mismatching_sizesnp.dot()c          	   C   s<   |  tj}||  W d Q R X | d|f t|j d S )Nz)%s arguments must all have the same dtype)r[   r
   TypingErrorr4   r5   r]   )r   rC   rD   	func_namer_   r   r   r   assert_mismatching_dtypes   s
    z%TestProduct.assert_mismatching_dtypesc          
   C   s   d}t dd|}x^| jD ]T}| ||}| ||}| ||||f | |||d d d |d d d f qW | |d tj}| |tj}| |||f | |tj}| |tj}| j|||f|d d S )N   T)nopythonr   )rd   )	r	   dtypesr(   rG   r   float64ra   float32re   )r   r=   rd   r%   rC   r&   r   r   r   r   r   check_dot_vv   s    *zTestProduct.check_dot_vvc             C   s   |  td dS )z/
        Test vector * vector np.dot()
        znp.dot()N)rl   r   )r   r   r   r   test_dot_vv   s    zTestProduct.test_dot_vvc             C   s   |  td dS )z 
        Test np.vdot()
        z	np.vdot()N)rl   r   )r   r   r   r   	test_vdot   s    zTestProduct.test_vdotc                s.  d\}} fdd}t dd|}|d k	r8t dd|}x<|||D ].\}	}
 |||	|
f  |||
|	jf qDW |d k	rxP|||D ]B\}	}
tj||	jd} |||	|
f|  |||
|	jf| qW  ||d tj}	 	|tj}
 
||	|
f  
||
|	jf |d k	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 k	r* ||tj}	 	|tj}
t|tj} ||	|
|f| d S )	N)   rf   c             3   s   x<dD ]4}  | |tjj|d} |tj}||fV  qW x2 jD ](}  | ||} ||}||fV  qFW |d d d |d d d fV  d S )NCF)rI   rh   )r+   r   rj   rY   r(   ri   )r*   r%   rI   r   r   r&   )r   r   r   samples   s    
z)TestProduct.check_dot_vm.<locals>.samplesT)rg   )r&   r   )r^   )r	   rG   Tr   rM   r&   rZ   r+   rj   r(   ra   rk   re   )r   pyfunc2pyfunc3rd   r*   r%   rq   cfunc2cfunc3r   r   r   r   )r   r   check_dot_vm   sD    

zTestProduct.check_dot_vmc             C   s   |  ttd dS )zC
        Test vector * matrix and matrix * vector np.dot()
        znp.dot()N)rw   r   r   )r   r   r   r   test_dot_vm   s    zTestProduct.test_dot_vmc                s:   fdd}t dd|}|d k	r0t dd|}xdD ]\}}}	x@||||	D ]0\}
} |||
|f  |||j|
jf qNW |d k	r6xl||||	D ]\\}
}tj||f|
jd} |||
|f| tj||f|
jd} |||j|
jf| qW q6W d\}}}	 ||	d tj}
 |	|tj} 	||
|f |d k	rt||ftj} 	||
||f  ||	tj}
 |	|tj}t||d ftj} j	||
||fdd	  ||	tj
}
 |	|tj} ||
|f| |d k	r6 ||	tj}
 |	|tj}t||ftj
} ||
||f| d S )
Nc             3   s   xPt ddD ]B\}} | |tjj|d} ||tjj|d}||fV  qW x4 jD ]*} | ||} |||}||fV  qZW |d d d |d d d fV  d S )Nrp   )rI   rh   )r   r+   r   rj   rY   ri   )r*   r%   kZorder_aZorder_br   r   r&   )r   r   r   rq      s    z)TestProduct.check_dot_mm.<locals>.samplesT)rg   ))ro   rf      )r   rf   rz   )r   r   rz   )r&   )ro   rf   rz   r   )r^   )r	   rG   rr   r   rM   r&   rZ   r+   rj   ra   rk   re   )r   rs   rt   rd   rq   ru   rv   r*   r%   ry   r   r   r   r   )r   r   check_dot_mm   sB     


zTestProduct.check_dot_mm	importantc             C   s   |  ttd dS )z/
        Test matrix * matrix np.dot()
        znp.dot()N)r{   r   r   )r   r   r   r   test_dot_mm  s    zTestProduct.test_dot_mmc             C   s   |  td dS )z&
        Test vector @ vector
        z'@'N)rl   r   )r   r   r   r   test_matmul_vv!  s    zTestProduct.test_matmul_vvc             C   s   |  tdd dS )z:
        Test vector @ matrix and matrix @ vector
        Nz'@')rw   r   )r   r   r   r   test_matmul_vm(  s    zTestProduct.test_matmul_vmc             C   s   |  tdd dS )z&
        Test matrix @ matrix
        Nz'@')r{   r   )r   r   r   r   test_matmul_mm/  s    zTestProduct.test_matmul_mmc       	   	   C   s  d\}}}t j}| |||d d d }| |||d d d }t ||f|}tddt}| |j ||| W d Q R X tddt}| |j |||| W d Q R X | 	||d d d }| 	||d d d }tddt
}| |j ||| W d Q R X d S )N)ro   rf   rz   rh   T)rg   )r   rj   r+   rM   r	   r   r?   Zpy_funcr   r(   r   )	r   r*   ry   r%   r&   r   r   r   rC   r   r   r   test_contiguity_warnings6  s     
z$TestProduct.test_contiguity_warningsN)F)rb   )#__name__
__module____qualname____doc__r   rj   rk   
complex128	complex64ri   r    r(   r+   
contextlibcontextmanagerr?   rG   rW   rZ   ra   re   r   rl   rm   rn   rw   rx   r{   r   r}   r   r~   r   r   r   r   r   r   r   r   +   s,   	


4:r   c             C   s   t j| S )N)r   linalginv)r   r   r   r   invert_matrixO  s    r   c             C   s   t j| S )N)r   r   cholesky)r   r   r   r   cholesky_matrixS  s    r   c             C   s   t j| S )N)r   r   eig)r   r   r   r   
eig_matrixW  s    r   c             C   s   t j| S )N)r   r   eigvals)r   r   r   r   eigvals_matrix[  s    r   c             C   s   t j| S )N)r   r   eigh)r   r   r   r   eigh_matrix_  s    r   c             C   s   t j| S )N)r   r   eigvalsh)r   r   r   r   eigvalsh_matrixc  s    r   c             C   s   t j| |S )N)r   r   svd)r   full_matricesr   r   r   
svd_matrixg  s    r   c             C   s   t j| S )N)r   r   qr)r   r   r   r   	qr_matrixk  s    r   rh   c             C   s   t j| ||S )N)r   r   lstsq)ABrcondr   r   r   lstsq_systemo  s    r   c             C   s   t j| |S )N)r   r   solve)r   r   r   r   r   solve_systems  s    r   V瞯<c             C   s   t j| S )N)r   r   pinv)r   r   r   r   r   pinv_matrixw  s    r   c             C   s   t j| S )N)r   r   slogdet)r   r   r   r   slogdet_matrix{  s    r   c             C   s   t j| S )N)r   r   det)r   r   r   r   
det_matrix  s    r   c             C   s   t j| |S )N)r   r   norm)r   ordr   r   r   norm_matrix  s    r   c             C   s   t j| |S )N)r   r   cond)r   pr   r   r   cond_matrix  s    r   c             C   s   t j| |S )N)r   r   matrix_rank)r   tolr   r   r   matrix_rank_matrix  s    r   c             C   s   t j| |S )N)r   r   matrix_power)r   r%   r   r   r   matrix_power_matrix  s    r   c             C   s   t | |S )N)r   trace)r   offsetr   r   r   trace_matrix  s    r   c             C   s
   t | S )N)r   r   )r   r   r   r   trace_matrix_no_offset  s    r   )r   	   c             C   s   t j| ||dS )N)r   )r   outer)r   r   r   r   r   r   outer_matrix  s    r   c             C   s   t | |S )N)r   r   )r   r   r   r   r   r     s    c             C   s   t | |S )N)r   kron)r   r   r   r   r   kron_matrix  s    r   c               @   s   e Zd ZdZejejejejfZ	dd Z
dd Zd ddZ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   s   t   d S )N)r   r   )r   r   r   r   r      s    zTestLinalgBase.setUpc             C   s>   t |}t|t jr(|d d |S |d d |S d S )Ny      ?      y               @g      ?r   )r   r!   r"   r#   r$   )r   r%   r&   r'   r   r   r   r(     s    
zTestLinalgBase.sample_vectorNc             C   s  d}t |dkrtd|dkr(td|tjtjtjtjgkrHtd|dk	r`|dk	r`td|dkrl|}|d	k r|td
tjd |\}}|dk s|dk rtdt	||}	|dkr|	}
n6|dkrtdt
|tstd|}
||	krtd|d	ks
|d	kr<||krtdt||}| ||||}n| || |||}tj|\}}| || |ddd ||}tj|\}}t|||
}t||f}tt||}|||d d|
 |d	 d|
 f< tt|||j}tj|||d}|S )a  
        Provides a sample matrix with an optionally specified rank or condition
        number.

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

        NOTE: Only one of rank or condition may be set.
        g      ?ro   zsize must be a length 2 tuple.)rJ   rH   z order must be one of 'F' or 'C'.z*dtype must be a numpy floating point type.Nz/Only one of rank or condition can be specified.r   zCondition number must be >=1.r   z+Negative dimensions given for matrix shape.zRank must be greater than zero.zRank must an integer.z"Rank given greater than full rank.z8Condition number was specified for a vector (always 1.).rh   )r&   rI   )r1   r\   r   rk   rj   r   r   randomseedmin
isinstancer   maxr(   r)   r   r   Zlinspacezerosnonzeroeyer   rr   array)r   rK   r&   rI   rank	conditionZd_condr*   r%   minmnrvZmaxmnQrT   U_VsvSidxr   r   r   specific_sample_matrix  sX    



"$z%TestLinalgBase.specific_sample_matrixc             G   s4   t dk r0x&|D ]}t|tjrd|jkrdS qW dS )a  
        returns True if an input argument has a dimension that is zero
        and Numpy version is < 1.13, else False. This is due to behaviour
        changes in handling dimension zero arrays:
        https://github.com/numpy/numpy/issues/10573
        )r      r   TF)numpy_versionr   r   ndarrayrR   )r   rD   xr   r   r   shape_with_0_input  s    

z!TestLinalgBase.shape_with_0_inputc          	   C   s4   |  |}||  W d Q R X | |t|j d S )N)r[   r4   r5   r]   )r   rC   rD   r`   errr_   r   r   r   assert_error  s    zTestLinalgBase.assert_errorc             C   s   d}|  |||tjj d S )Nz.Last 2 dimensions of the array must be square.)r   r   r   LinAlgError)r   rC   rD   r`   r   r   r   assert_non_square#  s    z TestLinalgBase.assert_non_squarec             C   s   d| }|  |||tj d S )Nz9np.linalg.%s() only supported on float and complex arrays)r   r
   rc   )r   namerC   rD   r`   r   r   r   assert_wrong_dtype'  s    z!TestLinalgBase.assert_wrong_dtypeTc             C   s.   |rdnd}d||f }|  |||tj d S )Nz	np.linalgr   z$%s.%s() only supported on 2-D arrays)r   r
   rc   )r   r   rC   rD   	la_prefixprefixr`   r   r   r   assert_wrong_dimensions+  s    z&TestLinalgBase.assert_wrong_dimensionsc             C   s   d}|  |||tjj d S )Nz$Array must not contain infs or NaNs.)r   r   r   r   )r   rC   rD   r`   r   r   r   assert_no_nan_or_inf0  s    z#TestLinalgBase.assert_no_nan_or_infc             C   s   t |tr&x|D ]}| || qW nft |ts|jj}|jj}d}| ||B | d}|dkrn| || n|dkr| || ntddS )a6  
        This checks that in a computed result from numba (array, possibly tuple
        of arrays) all the arrays are contiguous in memory and that they are
        all at least one of "C_CONTIGUOUS" or "F_CONTIGUOUS". The computed
        result of the contiguousness is then compared against a hardcoded
        expected result.

        got: is the computed results from numba
        expected_contig: is "C" or "F" and is the expected type of
                        contiguousness across all input values
                        (and therefore tests).
        z6Results are not at least one of all C or F contiguous.z0Computed contiguousness does not match expected.rH   rJ   zUnknown contigN)	r   tupleassert_contig_sanityr   rO   rQ   f_contiguous
assertTruer\   )r   rF   Zexpected_contigr   Zc_contigZf_contigr`   r   r   r   r   4  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   rC   rD   r`   r   r   r   assert_raise_on_singularY  s    z'TestLinalgBase.assert_raise_on_singularc             C   sv   |  |jd |jd  tj|jd |jd}dt|jj }|dkrPd| }|dkr`d| }tj|||| dS )zE
        Checks if a matrix is equal to the identity matrix.
        rh   )r&      N
   d   )	r7   rR   r   r   r&   finfo
resolutiontestingassert_allclose)r   rF   rtolatolr   r   r   r   r   assert_is_identity_matrix]  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   r\   )r   rC   rD   r`   r   r   r   assert_invalid_norm_kindm  s    z'TestLinalgBase.assert_invalid_norm_kindc             C   s   d}|  |||tjj d S )NzArrays cannot be empty)r   r   r   r   )r   rC   rD   r`   r   r   r   assert_raise_on_emptyt  s    z$TestLinalgBase.assert_raise_on_empty)NN)T)NN)r   r   r   r   r   rj   rk   r   r   ri   r    r(   r   r   r\   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s    

S
%
r   c               @   s   e Zd ZdZdd ZdS )TestTestLinalgBasez
    The sample matrix code TestLinalgBase.specific_sample_matrix()
    is a bit involved, this class tests it works as intended.
    c          	      s  t d dddddg}x4t| jdD ] \}}}|\}}t||} |||}|j| tj	|| |dkr|d }	 j||||	d	}|j| tj	||	 d
t
|j }
 |||}|j| tjjtj|d|
|
d |dkr(d} j||||d}|j| tjjtj|d|
|
d q(W tf fdd	}t }d}|dtjdf|td W d Q R X d}|dtjdf|td d}|dtjdf|td d}|dtjdf|td d}|dtjdddf|td d}|dtjdd df|td d}|dtjdf|td d}|dtjddf|td d }|dtjdd!f|td d"}|d#tjdd d$f|td d%}|dtjdd&f|td d S )'Nr   )   r   )   r   )r   r   )rf   rf   )r   r   FCr   )r   r   g      ?)r   r   g      $@)r   c          	      s6    |} j|   W d Q R X |t|j d S )N)r[   r   r4   r5   r]   )rD   r`   r   r_   )instr   r   r   check_error  s    zCTestTestLinalgBase.test_specific_sample_matrix.<locals>.check_errorZblank)ro   rf   rJ   )r   zsize must be a length 2 tuple.)r   z order must be one of 'F' or 'C'.zz*dtype must be a numpy floating point type.z/Only one of rank or condition can be specified.zCondition number must be >=1.rh   z+Negative dimensions given for matrix shape.)ro   zRank must be greater than zero.z"Rank given greater than full rank.rz   z8Condition number was specified for a vector (always 1.).)r   rf   r   zRank must an integer.g      ?)r   r   ri   r   r   r7   rR   r   r   r   r   r   r   r   r   r\   r[   rS   rj   int32)r   sizesrK   r&   rI   r*   r%   r   r   r   r   r   r   r_   r`   r   )r   r   r   test_specific_sample_matrix  sj    
 z.TestTestLinalgBase.test_specific_sample_matrixN)r   r   r   r   r   r   r   r   r   r   y  s   r   c               @   s$   e Zd ZdZededd ZdS )TestLinalgInvz"
    Tests for np.linalg.inv.
    r|   c                s   d}t ddt  fdd}x2tjdD ]"\}}||f||}|| q.W |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   T)rg   c          	      s   t | } | }|d d}ytjj||dd W n tk
rN   d}Y nX |rjt|| }|    |  W d Q R X d S )NrJ   Fr   )nulpT)	r   r   r   r   assert_array_almost_equal_nulprS   r   r   rA   )r   kwargsrE   rF   use_reconstructionrec)rC   r   r   r   check  s    



z,TestLinalgInv.test_linalg_inv.<locals>.checkrp   )r   r   )ro   rf   r   )ro   ro   )r&   N)r	   r   r   ri   r   r   rM   r   onesr   r   r   r   r   )r   r%   r  r&   rI   r   r   )rC   r   r   test_linalg_inv  s    zTestLinalgInv.test_linalg_invN)r   r   r   r   r   needs_lapackr  r   r   r   r   r     s   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&   rI   )r   r   r   randr   r   r!   r   rr   diagr   )	r   r*   r&   rI   r   qr   Lr   r   r   r   r+   "  s    z TestLinalgCholesky.sample_matrixc             C   s   d}|  |||tjj d S )Nz Matrix is not positive definite.)r   r   r   r   )r   rC   rD   r`   r   r   r   assert_not_pd.  s    z TestLinalgCholesky.assert_not_pdc                s   d}t ddt  fdd}x.tjdD ]\}}|||}|| q.W |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   T)rg   c          	      s    | r |  d S t| } | }d}|d ytjj||dd W n tk
rd   d}Y nX |rt|t|j	}dt
| jj }tjj| |||d    |  W d Q R X d S )NFrH   r   )r  Tr   )r   r   )r   r   r   r   r   r  rS   r   conjrr   r   r&   r   r   rA   )r   rE   rF   r  r  r   )rC   r   r   r   r  :  s,    



z6TestLinalgCholesky.test_linalg_cholesky.<locals>.checkr   )r   r   r   )ro   rf   )r&   )ro   ro   rz   ro   N)r	   r   r   ri   r+   r   rM   r   r  rj   r   r   r   r  r)   )r   r%   r  r&   rI   r   rnr   )rC   r   r   test_linalg_cholesky2  s    #z'TestLinalgCholesky.test_linalg_choleskyN)r   r   r   r   r+   r  r	  r  r   r   r   r   r
    s   r
  c               @   sZ   e Zd Z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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   rh   )r&   rI   )r(   r   r  r   r   rR   r   )r   r*   r&   rI   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   rC   rD   r`   r   r   r   assert_no_domain_change  s    z.TestLinalgEigenSystems.assert_no_domain_changeNc          	      sp  d}t dd  fdd}x.tjdD ]\}}|||}	||	 q4W xtjtjgD ]}
|tjd|
d  tj	d	|
df 
 tj	d
tjdf  tj	d|
df  tjddgtjtjgg|
df qdW |rltddgddgg}||tj |\}}t|j x,tjtjgD ]}
 ||
f qLW dS )z$
        Test np.linalg.eig
        r   T)rg   c          	      s   | r |  d S | } | }t|t| d}t|tr^d}t| n|j |d d}xLtt|D ]<}ytj	j
|| || dd W q tk
r   d}Y qX qW dt| jj }|r|r|\}}d dkrxt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 Q R X d S )NFTrJ   r   )r  r   rh   hr   r   )r   r   )r   r7   r1   r   r   ndimr   rN   r   r   r  rS   r   r&   r   r   r   rR   r  realr  Zdiag_indicesr   r   iscomplexobjimagsortrA   )r   rE   rF   Zres_is_tupler  ry   r   r>   r  ZidxlZidxuZlhsZrhs)rC   expected_res_lenfuncr   r   r   r   r    sb    

   

z<TestLinalgEigenSystems.checker_for_linalg_eig.<locals>.checkr   )r   r   )r&   )ro   rf   )ro   ro   g      ?g       @r   r   ro   N)r	   r   ri   r+   r   rk   r   rM   r   r  r   r   r   r   r   infnanr$   r   r   anyr  rj   r  )r   r   r  r  Zcheck_for_domain_changer%   r  r&   rI   r   Ztyr   lr   r   )rC   r  r  r   r   r   checker_for_linalg_eig  s,    bz-TestLinalgEigenSystems.checker_for_linalg_eigc             C   s   |  dtdd d S )Nr   ro   T)r"  r   )r   r   r   r   test_linalg_eig%  s    z&TestLinalgEigenSystems.test_linalg_eigc             C   s   |  dtdd d S )Nr   r   T)r"  r   )r   r   r   r   test_linalg_eigvals)  s    z*TestLinalgEigenSystems.test_linalg_eigvalsc             C   s   |  dtdd d S )Nr   ro   F)r"  r   )r   r   r   r   test_linalg_eigh-  s    z'TestLinalgEigenSystems.test_linalg_eighc             C   s   |  dtdd d S )Nr   r   F)r"  r   )r   r   r   r   test_linalg_eigvalsh1  s    z+TestLinalgEigenSystems.test_linalg_eigvalsh)N)r   r   r   r   r+   r  r"  r	  r#  r$  r%  r&  r   r   r   r   r  u  s   
 r  c               @   s   e Zd ZdZedd ZdS )TestLinalgSvdz"
    Tests for np.linalg.svd.
    c                s   t ddt  fdd}ddddd	g}d
}x:t|j|dD ]&\}}}}|||}|||d q@W 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 x&dD ]}
t|
df} | qW dS )z$
        Test np.linalg.svd
        T)rg   c          	      s`  t | f|} | f|}t|t| t|d |d d}xLtt|D ]<}ytjj|| || dd W qZ tk
r   d}Y qZX qZW |r<|\}}}x,tt|D ]}|| j	|| j	 qW t
|j	d |j	d f}	t|	| tt||	|}
t| jj}tjj| |
d| d	| d
    | f| W d Q R X d S )Nrf   rJ   Fr   )r  Tr   r   r   )r   r   )r   r7   r1   r   rN   r   r   r  rS   rR   r   Zfill_diagonalr   r   r&   r   r   rA   )r   r  rE   rF   r  ry   ur   Zvtsr  r   )rC   r   r   r   r  B  s6    


z,TestLinalgSvd.test_linalg_svd.<locals>.check)r   r   )r   r   )r   r   )rf   rf   )r   r   )TFr   )r   r   )ro   ro   )r&   r   g      ?g       @))r   r   )r   r   )r   r   N)r	   r   r   ri   r   r   r   r  r   r   rj   r   r   r  r  rM   r   )r   r  r   r   rK   r&   ZfmatrI   r   r  szrD   r   )rC   r   r   test_linalg_svd;  s&    8
zTestLinalgSvd.test_linalg_svdN)r   r   r   r   r	  r+  r   r   r   r   r'  6  s   r'  c               @   s   e Zd ZdZedd ZdS )TestLinalgQrz!
    Tests for np.linalg.qr.
    c       	         s   t ddt  fdd}ddddd	g}x2t|jd
D ] \}}}|||}|| q:W 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 x dD ]} t|f qW dS )z#
        Test np.linalg.qr
        T)rg   c       
   	      sJ  t | f|} | f|}t|t| t|d |d d}xLtt|D ]<}ytjj|| || dd W qZ tk
r   d}Y qZX qZW |r&|\}}x,tt|D ]}|| j	|| j	 qW t
||}t| jj}	tjj| |d|	 d|	 d t
t|j|    | f| W d Q R X d S )	Nro   rJ   Fr   )r  Tr   )r   r   )r   r7   r1   r   rN   r   r   r  rS   rR   r   r   r&   r   r   r   	conjugaterr   rA   )
r   r  rE   rF   r  ry   r  rr  r   )rC   r   r   r   r    s4    

z*TestLinalgQr.test_linalg_qr.<locals>.check)r   r   )r   r   )r   r   )rf   rf   )r   r   r   r   )ro   ro   )r&   r   g      ?g       @))r   r   )r   r   )r   r   N)r	   r   r   ri   r   r   r   r  r   r   rj   r   r   r  r  r   rM   )	r   r  r   rK   r&   rI   r   r  r*  r   )rC   r   r   test_linalg_qr  s"    7
zTestLinalgQr.test_linalg_qrN)r   r   r   r   r	  r/  r   r   r   r   r,    s   r,  c               @   s*   e Zd ZdZd
ddZdd Zdd Zd	S )TestLinalgSystemszu
    Base class for testing "system" solvers from np.linalg.
    Namely np.linalg.solve() and np.linalg.lstsq().
    Tc             C   s.   |rdnd}d||f }|  |||tj d S )Nz	np.linalgr   z*%s.%s() only supported on 1 and 2-D arrays)r   r
   rc   )r   r   rC   rD   r   r   r`   r   r   r   assert_wrong_dimensions_1D   s    z,TestLinalgSystems.assert_wrong_dimensions_1Dc             C   s   d}|  |||tjj d S )Nz<Incompatible array sizes, system is not dimensionally valid.)r   r   r   r   )r   rC   rD   r`   r   r   r   assert_dimensionally_invalid  s    z.TestLinalgSystems.assert_dimensionally_invalidc             C   s   d| }|  |||tj d S )NzAnp.linalg.%s() only supports inputs that have homogeneous dtypes.)r   r
   rc   )r   r   rC   rD   r`   r   r   r   assert_homogeneous_dtypes  s    z+TestLinalgSystems.assert_homogeneous_dtypesN)T)r   r   r   r   r1  r2  r3  r   r   r   r   r0    s   
r0  c               @   s   e Zd ZdZedd ZdS )TestLinalgLstsqz$
    Tests for np.linalg.lstsq.
    c                s  t ddt  fddddddd	g}tj}d
dg}t|d}fdd}x|D ]}t|}t}|||}	||	| |\}
}t|
|}|
dkr^|dkr^|d }j||||d}	||	| j||||d}	d| }|| }||	||d q^W ddgddgddgddgg}x2|D ]*\}	}t|	t|f}	 | q&W tj
ddgddggtjd} ||ff d}tj
ddgdd ggtjd}| ||f | ||f tj
ddgdd ggtjd}| ||f | ||f tj
ddgtjd}| ||f tj
ddgtjtjggtjd} ||f  ||f tj
ddgtjd} ||ff tj
ddgdd ggd!d"gd#d$gggtjd}| ||f tj
dgtjd}tj
dgdgdggtjd} ||f  ||f d%S )&z&
        Test np.linalg.lstsq
        T)rg   c                s  t | |f|} | |f|}t|t| t|d |d d}yf|d |d  xLtt|D ]<}ytjj|| || dd W qt tk
r   d}Y qtX qtW W n tk
r   d}Y nX |rt|\}}}	}
dd	d
g}yN|	|d  x8|D ]0}t	|| tj
r|| j|| j qW W n0 tk
rj   t|	|d  dk  Y nX t| jj}y,t| |}tjj||d| d| d W n tk
rr   x|D ]}y(tjj|| || d| d| d W n6 tk
r    tj| }d| d|  Y nX tj|t| |d  }tj|t| | }tjj||dd qW Y nX    | |f| W d Q R X d S )Nrz   rH   Fro   r   )r  Tr   r   rf   )r   r   r   g      ?g      $@)r   )r   r7   r1   r   rN   r   r   r  rS   r   r   rR   r   absr   r&   r   r   r   r   r   ZassertGreaterr   rA   )r   r   r  rE   rF   r  ry   r   resr   r)  Zout_array_idxr   r  cZres_expectedZres_got)rC   r   r   r   r  %  sh    


" 

z0TestLinalgLstsq.test_linalg_lstsq.<locals>.check)r   r   )r   r   )r   r   )rf   rf   )r   r   rJ   rH   g      $@c                sr   d}xh|D ]`}t }| jd |f||} | |f| t }|d d df j|d} | |f| q
W d S )N)r   r   r   )rI   )nextr   rR   rY   )r   dtr  b_sizesb_sizeb_orderr   rT   )r  cycle_orderr   r   r   inner_test_loop_fn  s    
z=TestLinalgLstsq.test_linalg_lstsq.<locals>.inner_test_loop_fnr   )r   )r   g      ?)r   )r   r   )r   )r   r   )r   r   )r   g       @g      @g      @)r&   r   ro   rf   rz   r      r      N)r	   r   r   ri   r8  r   r   r   rM   r   r   rj   r   r   rk   r3  r   r  r  r   r1  r2  )r   r   Zcycle_dtZordersspecific_condr>  Za_sizer9  Za_orderr   r*   r%   r   r.  r   approx_half_rank_rcondZemptiesr   rD   okr  badZoneDbad1Dbad2Dr   )rC   r  r=  r   r   test_linalg_lstsq  sn    \





 ,z!TestLinalgLstsq.test_linalg_lstsqN)r   r   r   r   r	  rG  r   r   r   r   r4    s   r4  c               @   s   e Zd ZdZedd ZdS )TestLinalgSolvez$
    Tests for np.linalg.solve.
    c                s  t ddt  fdd}dddg}xt|jdD ]x\}}}|||}d	}xZt|dD ]L\}}	|jd
 |f||	}
|||
 |
ddd
f j|	d}||| q^W q6W  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
        T)rg   c          	      s   t | |f|} | |f|}|d d}ytjj||dd W n tk
rZ   d}Y nX |r|j|j t| |}t	| j
j}tjj||d| d| d    | |f| W d Q R X d S )NrJ   Fr   )r  Tr   )r   r   )r   r   r   r   r  rS   r7   rR   r   r   r&   r   r   rA   )r   r   r  rE   rF   r  r  r   )rC   r   r   r   r    s(    


z0TestLinalgSolve.test_linalg_solve.<locals>.check)r   r   )rf   rf   )r   r   r   )r   r   r   N)rI   )r   r   )r   g      ?g        )r&   r   r   ro   rf   rz   g       @r   r?  r   r@  g      @)ro   ro   rH   )r   )r	   r   r   ri   r   rR   rY   r   rM   r   rj   r   r   rk   r3  r   r  r  r   r1  r2  r   )r   r  r   rK   r&   rI   r   r:  r;  r<  r   rT   rC  r  rD  Zok_oneDrE  rF  r   )rC   r   r   test_linalg_solve  sL    +


 
,z!TestLinalgSolve.test_linalg_solveN)r   r   r   r   r	  rI  r   r   r   r   rH    s   rH  c               @   s   e Zd ZdZedd ZdS )TestLinalgPinvz#
    Tests for np.linalg.pinv.
    c                s8  t ddt  fdd}ddddd	g}d
}xt|jdD ]p\}}}|||}|| |\}}	|dkr>|	dkr>t||	}
j||||d}d| }|
| }|||d q>W xdD ]}|t| qW d}| tj	dtj
df | tj	dtjdf  tjddgtjtjggtjdf dS )z%
        Test np.linalg.pinv
        T)rg   c       	   	      s   | r | f| d S t| f|} | f|}|d d}ytjj||dd W n tk
rp   d}Y nX |rn|j|j t	|| }y
| W n tk
rl   dt| jj } |}tjj|| d| d| d | jd	 | jd
 krPtddt}|| t| jd	 | jf|d	 }tjj||d| d| d tj|| | Y nX    | f| W d Q R X d S )NrJ   Fr   )r  Tr   r   )r   r   r   r   )rg   )r   r   r   r   r   r  rS   r7   rR   r   r   r   r&   r   r   r	   r   r   r$   Z
assertLessr   r   rA   )	r   r  rE   rF   r  r  r   r   Z
lstsq_pinv)rC   r   r   r   r    sN    


z.TestLinalgPinv.test_linalg_pinv.<locals>.check)r   r   )r   r   )r   r   )rf   rf   )r   r   g      $@r   r   )r   g      ?)r   ))r   r   )r   r   r   )ro   ro   )r&   r   g       @N)r	   r   r   ri   r   r   r   rM   r   r  r   r   rj   r   r   r  r  )r   r  r   rA  rK   r&   rI   r   r*   r%   r   r   rB  r*  r  r   )rC   r   r   test_linalg_pinv  s4    I


zTestLinalgPinv.test_linalg_pinvN)r   r   r   r   r	  rK  r   r   r   r   rJ  }  s   rJ  c               @   s@   e Zd ZdZdd Zdd Z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   sz   |  |r||f| d S t|f|}||f|}dt|jj }tjj|||d |   ||f| W d Q R X d S )Nr   )r   )	r   r   r   r   r&   r   r   r   rA   )r   rC   r   r  rE   rF   r   r   r   r   	check_det  s    

z!TestLinalgDetAndSlogdet.check_detc       	   	   K   s   |  |r||f| d S t|f|}||f|}| t|t| | t|d x0tdD ]$}| t|| t||  q`W |j|d }tj	j
||d dd dt|jj }tj	j|d |d ||d |   ||f| W d Q R X d S )Nro   r   r   )r  r   r   )r   r   )r   r   r7   r1   rN   r   r  r&   typer   r  r   r   r   rA   )	r   rC   r   r  rE   rF   ry   Zgot_convr   r   r   r   check_slogdet  s&    

z%TestLinalgDetAndSlogdet.check_slogdetc       	      C   s   dddg}x4t || jdD ]"\}}}| |||}||| qW x0t | jdD ] \}}tjd|d}||| qNW ||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   )rz   rz   )r   r   r   )rf   rf   )r&   )r   r   )ro   ro   r   g      ?g       @)r   ri   r   r   r   rM   r   r  r   r   rj   r   r   r  r  )	r   r  r  rC   r   rK   r&   rI   r   r   r   r   do_test>  s     
zTestLinalgDetAndSlogdet.do_testc             C   s"   t ddt}| d| j| d S )NT)rg   r   )r	   r   rP  rM  )r   rC   r   r   r   test_linalg_det_  s    z'TestLinalgDetAndSlogdet.test_linalg_detc             C   s"   t ddt}| d| j| d S )NT)rg   r   )r	   r   rP  rO  )r   rC   r   r   r   test_linalg_slogdetd  s    z+TestLinalgDetAndSlogdet.test_linalg_slogdetN)
r   r   r   r   rM  rO  rP  r	  rQ  rR  r   r   r   r   rL    s   (!rL  c               @   s   e Zd ZdZedd ZdS )TestLinalgNormz#
    Tests for np.linalg.norm.
    c       
         s  t ddt  fdd}dddg}dtjtj d	dd
dddddg}x4t|j|D ]"\}}}||}|||d qVW x:tj|D ]*\}}d|ddd }|||d qW dddddg}dtjtj dd
ddg}x:t|jd|D ]&\}}}}|||}|||d qW dg}xvtj|dD ]d\}}}d||}||dd |d ||ddddf |d ||ddddf |d q0W xbtj|dD ]P\}}}tjd||d}	 ||d tjd||d}	 ||d qW d}	
|	 tjdtjd f |	 tjd!tjd dddf  tjd"d#gtjtjggtjd df  tjd"d#gd$d%ggtjd d&f dS )'z%
        Test np.linalg.norm
        T)rg   c          	      sr   t | f|} | f|}t|  dt| jj }tjj|||d 	   | f| W d Q R X d S )Nr   )r   )
r   r   r   r  r   r&   r   r   r   rA   )r   r  rE   rF   r   )rC   r   r   r   r  y  s    
z.TestLinalgNorm.test_linalg_norm.<locals>.checkr   rz   r   Nr   rh   ro   r   r   g@g333333)r   r   rf   )r   r   )r   r   )r   r   )rf   rf   )r   r   r   )   r   )r   )r&   rI   g        )r   r   r   )ro   ro   )r&      g      ?g       @g      @g      @r?  )r	   r   r   r  r   ri   r(   r   rM   r7   r   r  r   r1  rj   r)   r   r   r  r   )
r   r  r   Z	nrm_typesrK   r&   Znrm_typer   rI   r  r   )rC   r   r   test_linalg_normr  sV    
  zTestLinalgNorm.test_linalg_normN)r   r   r   r   r	  rV  r   r   r   r   rS  m  s   rS  c               @   s   e Zd ZdZedd ZdS )TestLinalgCondz#
    Tests for np.linalg.cond.
    c          	      s  t ddt  fdd}dtjtj dddd	g}d
dg}x:t|jd|D ]&\}}}}|||}|||d qNW ddddg}x2t|jdD ] \}}}|||}|| qW x dD ]}	 t|	f qW t	
 \ tjddgddggtjd}tdk r&t	dt td|| t	dt || W dQ R X d}
|
 tjdtjdf |
 tjdtjdf  tjddgtjtjggtjdf  tjddgd d!ggtjdd"f dS )#z%
        Test np.linalg.cond
        T)rg   c          	      sr   t | f|} | f|}t|  dt| jj }tjj|||d 	   | f| W d Q R X d S )Nr   )r   )
r   r   r   r  r   r&   r   r   r   rA   )r   r  rE   rF   r   )rC   r   r   r   r    s    
z.TestLinalgCond.test_linalg_cond.<locals>.checkNr   rh   ro   r   )rf   rf   )r   r   r   )r   )r   r   )r   r   )r   r   )r   r   ))r   r   )r   r   )r   r   gr   g?)r&   )r      errorzoverflow encountered in.*ignorer   )ro   ro   r   g      ?g       @g      @g      @r?  )r	   r   r   r  r   ri   r   r   rM   r.   r/   r   rj   r   r0   RuntimeWarningZassertRaisesRegexpr   r  r   r   r   r  r   )r   r  Zpsr   rK   r&   rI   r   r   r*  r  r   )rC   r   r   test_linalg_cond  sD    


zTestLinalgCond.test_linalg_condN)r   r   r   r   r	  r\  r   r   r   r   rW    s   rW  c               @   s   e Zd ZdZedd ZdS )TestLinalgMatrixRankz*
    Tests for np.linalg.matrix_rank.
    c          	      s  t ddt  fdd}ddddd	g}xt|jd
D ]\}}}|||}|| d}x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 qxW d|ddddf<  |d || t	|rd|d< nd|d<  ||d |||d q<W xVjD ]L}t	jd|d} |d || d|d<  |d || qW x4dD ],}x$dD ]} t	||f qLW qBW 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
        T)rg   c          	      sJ   t | f|} | f|}tj||    | f| W d Q R X d S )N)r   r   r   r   rA   )r   r  rE   rF   )rC   r   r   r   r  6  s
    
z;TestLinalgMatrixRank.test_linalg_matrix_rank.<locals>.check)r   r   )r   r   )r   r   )rf   rf   )r   r   r   gvIh%<=r   )r   g        Ng      ?y              ?y+=+=r   g+=)r   )rh   rh   r   )r&   ))r   r   )r   r   )r   r   )NgvIh%<=r   )ro   ro   rU  ro   rf   g       @)r	   r   r   ri   r   rN   r   r7   rR   r   r   r   r  r   r  r$   r   r   rM   r   r  r   r1  rj   r)   r   r   r  r  )r   r  r   rK   r&   rI   r   r   ry   r*   r%   r   r   r9  r*  r  r   )rC   r   r   test_linalg_matrix_rank.  sh    

*


"z,TestLinalgMatrixRank.test_linalg_matrix_rankN)r   r   r   r   r	  r^  r   r   r   r   r]  )  s   r]  c               @   s$   e Zd ZdZdd Zedd ZdS )TestLinalgMatrixPowerz+
    Tests for np.linalg.matrix_power.
    c          	   C   s2   ||d d |  tj ||  W d Q R X d S )Nr   r   )r[   r
   rc   )r   rC   rD   r   r   r   assert_int_exponenent  s    z+TestLinalgMatrixPower.assert_int_exponenentc                sR  t ddt  fdd}dddg}dd	gttd
d ddg }xRt||jdD ]>\}}}}|||}||| tjd||d}||| qVW 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 )NT)rg   c          	      sh   t | |} | |}|d dt| jj }tjj||||d    | | W d Q R X d S )NrH   r   )r   r   )	r   r   r   r   r&   r   r   r   rA   )r   pwrrE   rF   r6  )rC   r   r   r   r    s    


z=TestLinalgMatrixPower.test_linalg_matrix_power.<locals>.check)r   r   )r   r   )r   r   iiir   rT  !   r   )r   r   )r&   rI   r   )ro   ro   )r&   r   )rf   r   zinput must be a square arrayg333333?g        r   rh   )r	   r   listrN   r   ri   r   r   rM   r   r  r   r   r   rj   r`  r   r   )r   r  r   ZpowersrK   ra  r&   rI   r   r  rD   r`   r   )rC   r   r   test_linalg_matrix_power  s,    

z.TestLinalgMatrixPower.test_linalg_matrix_powerN)r   r   r   r   r`  r	  rd  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 )NT)rg   )superre  r    r	   r   cfunc_w_offsetr   cfunc_no_offset)r   )	__class__r   r   r      s    zTestTrace.setUpc          	   K   s0   || |  tj ||f| W d Q R X d S )N)r[   r
   rc   )r   rC   r   r  r   r   r   assert_int_offset  s    zTestTrace.assert_int_offsetc       
         s   fdd}dddddg}dd	d
gt tdd dddg }xvt|| jdD ]b\}}}} |||}|||d |dkr|| tjd||d}|||d |dkrN|| qNW 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|krt | f|} j}nt| f|} j}|| f|}dt| jj }tjj	||||d  
  || f| W d Q R X d S )Nr   r   )r   r   )r   rg  r   rh  r   r   r&   r   r   r   rA   )r   r  rE   rC   rF   r6  )r   r   r   r    s    
z#TestTrace.test_trace.<locals>.check)r   r   )r   r   )r   r   )rf   rf   )r   r   iiiir   r   rU  r   r   )r   r   )r   r   )r&   rI   r   )r&   r   F)ro   ro   g333333?)rc  rN   r   ri   r   r   rM   r   rg  r  rj   rh  rj  )
r   r  r   ZoffsetsrK   r   r&   rI   r   r  r   )r   r   
test_trace  s*    "

zTestTrace.test_tracec          	   C   sd   t ddddd }tjdtjd}|| | t}|d W dQ R X t|j}| d	| dS )
z
Issue 2314z(optional(float64[:,:]),)T)rg   c             S   s
   t | S )N)r   r   )r   r   r   r   tested	  s    z5TestTrace.test_trace_w_optional_input.<locals>.tested)r   r   )r&   Nz(expected array(float64, 2d, A), got None)	r	   r   r  rj   r[   	TypeErrorr5   r]   r7   )r   rl  r   r_   errmsgr   r   r   test_trace_w_optional_input	  s    
z%TestTrace.test_trace_w_optional_input)	r   r   r   r   r    rj  rk  ro  __classcell__r   r   )ri  r   re    s
   2re  c               @   sh   e Zd ZeddddgZeddddgZddddddd	d
gZdd Zdd Zdd Z	dd Z
dd ZdS )
TestBasicsrJ   rH   )r   r   )rf   rf   )r   r   )r   )r   )rf   g      @g      @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)r1  r   r   rj   r  )r   r  rC   r   r   r   _assert_wrong_dim3	  s    (zTestBasics._assert_wrong_dimc             C   sP   t |ts|S t|dkr*| |d |S | |d |d  |j||dS d S )Nr   r   )rI   )r   r   r1   r(   r)   )r   rK   r&   rI   r   r   r   
_gen_input:	  s    
zTestBasics._gen_inputc             C   sT   |  ||t| j}|  ||t| j}t|r:|d }t|rL|d }||fS )Ny              ?)rs  r8  order1order2r   r  )r   size1size2r&   r   r   r   r   r   
_get_inputF	  s    

zTestBasics._get_inputc                s   t ddt  fdd}x|tjjjD ]f\}}}|||\}}||| tdkr0tjt	|j
t	|j
ft	|jd}||||d q0W d  d S )	NT)rg   c          	      s   t | |} | |}dtt| jj }tjj||||d d|kr | |f|}tjj||||d tjj|d |||d    | |f| W d Q R X d S )Nr   )r   r   r   )	r   r   r   asarrayr&   r   r   r   rA   )r   r   r  rE   rF   r6  )rC   r   r   r   r  S	  s    



z$TestBasics.test_outer.<locals>.check)r   r   )r&   )r   r   )r	   r   r   r   ri   rx  r   r   rM   ry  rK   r&   rr  )r   r  rv  rw  r&   r   r   r7  r   )rC   r   r   
test_outerP	  s    
zTestBasics.test_outerc                sj   t ddt  fdd}x<tjjjD ]&\}}}|||\}}||| q0W d  d S )NT)rg   c          	      sb   t | |} | |}dtt| jj }tjj||||d    | | W d Q R X d S )Nr   )r   r   )	r   r   r   ry  r&   r   r   r   rA   )r   r   r  rE   rF   r6  )rC   r   r   r   r  v	  s    


z#TestBasics.test_kron.<locals>.checkr   )r	   r   r   r   ri   rx  rr  )r   r  rv  rw  r&   r   r   r   )rC   r   r   	test_krons	  s    zTestBasics.test_kronN)r   r   r   r   rt  ru  r   rr  rs  rx  rz  r{  r   r   r   r   rq  *	  s   
#rq  __main__)r   )rh   )r   )N)N)N)r   )N)SZ
__future__r   r   r   r   	itertoolsr   r   sysr.   Znumbersr   r   platformZnumpyr   Znumbar   Zunittestr	   r
   Znumba.numpy_supportr   r   Zsupportr   r   r   r   r   machinerX   Zscipy.linalg.cython_lapackZscipyZ
has_lapackImportErrorZ
skipUnlessr	  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
  r  r'  r,  r0  r4  rH  rJ  rL  rS  rW  r]  r_  re  rq  r   mainr   r   r   r   <module>   s   
  &







 Sj:X Bd_ s{qiSkBT`
