U
    Hvf                    @   s  d Z dZddlZddlZddlZddlZddlmZm	Z	m
Z
mZmZmZ ddlZddlmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: ddl;m<Z< dd	l=m>Z> dd
l?m@Z@ ddlmAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZW ddlXmYZYmZZZ ddl[m\Z\ ddl]m^Z^ ddl_m`Z` ddlambZb decfddZdejIejegZfejJejggZhefeh ZidfddZjdd Zkdd Zldd ZmG dd dZnG dd  d ZoG d!d" d"ZpG d#d$ d$ZqG d%d& d&ZrG d'd( d(ZsG d)d* d*esZtG d+d, d,ZuG d-d. d.ZvG d/d0 d0evZwG d1d2 d2ZxG d3d4 d4ZyG d5d6 d6ZzG d7d8 d8Z{G d9d: d:Z|G d;d< d<Z}G d=d> d>Z~d?d@ ZG dAdB dBZG dCdD dDZG dEdF dFZdGdH Zejje dIkdJdKdLdM ZdNdO ZdPdQ ZejjddRdSdTdU ZG dVdW dWZdgdXdYZejjejjeUejjdZk d[dKd\d] Zd^d_ Zd`da Zdbdc ZG ddde deZdS )hz* Test functions for linalg.decomp module

z~
Build linalg:
  python setup_linalg.py build
Run tests if scipy is installed:
  python -c 'import scipy;scipy.linalg.test()'
    N)assert_equalassert_almost_equalassert_array_almost_equalassert_array_equalassert_assert_allclose)raises)eigeigvalslusvdsvdvalscholeskyqrschurrsf2csflu_solve	lu_factorsolvediagsvd
hessenbergrq
eig_bandedeigvals_bandedeigheigvalshqr_multiplyqzorthordqzsubspace_angleshadamardeigvalsh_tridiagonaleigh_tridiagonal
null_spacecdf2rdfLinAlgError)
dgbtrfdgbtrszgbtrfzgbtrsdsbevdsbevddsbevxzhbevdzhbevxget_lapack_funcs)norm)_select_function)ortho_group)arraydiagonesfulllinalgargsortzerosarangefloat32	complex64ravelsqrt	iscomplexshapesortsignasarrayisfinitendarrayeyedtypetriutril)seedrandom)assert_no_overwrite)matrix)check_free_memory)	HAS_ILP64Fc                 C   s   |t kr<tj| | tj| | d  }|| j d }ntj| | }||j d }|rv|td|  t|  7 }||S )z7Generate random sym/hermitian array of the given size n              ?   )	COMPLEX_DTYPESnprL   randconjTr?   rG   astype)nposdefrH   A r\   B/tmp/pip-unpacked-wheel-96ln3f52/scipy/linalg/tests/test_decomp.py_random_hermitian_matrix3   s     r^      c                 C   s~   t | }t |r,t|jdt|j  S t |jj}t 	|\}}d||  }||9 }t j
||d || }t ||S )zCClears trailing `fuss_binary_bits` of mantissa of a floating numberrQ          @)out)rT   Z
asanyarrayZiscomplexobj
clear_fussrealimagfinforH   ZnmantfrexpZrintldexp)arZfuss_binary_bitsxZsignificant_binary_bitsZx_mantZx_expfr\   r\   r]   rb   G   s    

rb   c                 C   sN   t | tr| j} nt| } t |tr,|j}nt|}t| |kd| | d S )Nz%dtype mismatch: "{}" (should be "{}"))
isinstancerF   rH   r   format)ZactZdesr\   r\   r]   assert_dtype_equalX   s    


rm   c                 C   s   t | tr | }t|d d }n0t | trHt| jdkrH| jd }| }ntdt|}|j	
 t| | }d|j	|  }|S )a  Return a random symmetric (Hermitian) matrix.

    If 'dim_or_eigv' is an integer N, return a NxN matrix, with eigenvalues
        uniformly distributed on (-1,1).

    If 'dim_or_eigv' is  1-D real array 'a', return a matrix whose
                      eigenvalues are 'a'.
    rR      r   zinput type not supported.      ?)rk   intrL   rF   lenrA   	TypeErrorr3   ZrvsrW   rV   r5   )Zdim_or_eigvdimdvhr\   r\   r]   symrandi   s    	



rw   c                 C   s4   t | t |  }}|dt|t|   }||S )NrQ   )rw   rI   rJ   rX   )rs   rH   Za1Za2ar\   r\   r]   _complex_symrand   s    ry   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestEigValsc                 C   sT   dddgdddgdddgg}t |}dtd d ddtd d g}t|| d S )	Nrn   rR            	   ]   r   r
   r?   r   selfrx   wexact_wr\   r\   r]   test_simple   s    "zTestEigVals.test_simplec                 C   sj   t dddgdddgdddggdj}| }|j}t|}dtd d d	dtd d g}t|| d S )
Nrn   rR   r{   r|   r}   rt   r~   r   r   )r4   rW   copyr
   r?   r   r   r\   r\   r]   test_simple_tr   s    $"zTestEigVals.test_simple_trc                 C   sT   dddgdddgdddgg}t |}dtd d ddtd d g}t|| d S )	Nrn   rR   r{   r|         @      ?y      "@      ?y      W@      @r   r   r   r\   r\   r]   test_simple_complex   s    zTestEigVals.test_simple_complexc                 C   sX   dddgdddgdddgg}t |dd}dtd	 d d
dtd	 d g}t|| d S )Nrn   rR   r{   r|   r}   Fcheck_finiter~   r   r   r   r   r\   r\   r]   test_finite   s    "zTestEigVals.test_finiteN)__name__
__module____qualname__r   r   r   r   r\   r\   r\   r]   rz      s   rz   c                   @   sz   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zej	j
dddd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )TestEigc           	      C   s  t dddgdddgdddgg}t|\}}dtd d ddtd d g}t dddtdd  d g}t d	dd
g}t dddtdd  d g}|t| }|t| }|t| }t|| t||d d df t|d   t||d d df t|d   t||d d df t|d   tdD ]4}t||d d |f  || |d d |f   q4t|ddd\}}tdD ]6}t|j|d d |f  || |d d |f   qd S )Nrn   rR   r{   r|   r}   r~   r   r         @r   r   r   rn   r   rR   leftright)r4   r	   r?   r1   r   rC   rangerW   	r   rx   r   ru   r   Zv0Zv1Zv2ir\   r\   r]   r      s$     "
"""2zTestEig.test_simplec                 C   s   t ddgddgg}t|ddd\}}}t|t ddg tdD ]2}t||d d |f  || |d d |f   qBtdD ]<}t| j|d d |f  ||  |d d |f   q~d S )Nrn   rR   r         ?       @y      ?       )r4   r	   r   r   rV   rW   r   rx   r   Zvlvrr   r\   r\   r]   test_simple_complex_eig   s    0zTestEig.test_simple_complex_eigc                 C   s   t dddgdddgdddgg}t|ddd\}}}tdD ]2}t||d d |f  || |d d |f   q<tdD ]<}t| j|d d |f  ||  |d d |f   qxd S )Nrn   rR   r{   r|   r   r   )r4   r	   r   r   rV   rW   r   r\   r\   r]   r      s     0zTestEig.test_simple_complexc                 C   sr   dgg}dgg}t ||dd\}}t|d d t|d dk t|d t ||\}}t|tj t|d d S )Nrn   r   TZhomogeneous_eigvals)rn   r   r   )r	   r   r   r   rT   inf)r   rx   br   r   r\   r\   r]   test_gh_3054   s    
zTestEig.test_gh_3054c                 C   s  |d k	r t |t | }}|}nt |}|}tj|j }d||f }t||dd\}}t||dd}|| |dd d f  }|| |dd d f  }	t|jd D ].}
t|d d |
f |	d d |
f dd|d q|d krt|dd d f d t|dd d f d t|}t|}t|d d |f |d d |f dd|d	 t	t
|}tt
|D ]}
t|d d |
f ||
< q`t|t|j|ddd
 |dd d f dk}|d|f |d|f  }t||\}}t||}|| }|| | }	||	 }t|jd D ]@}
tt|d d |
f rt|d d |
f ddd|d q|t| }|t| }tt|}tt|}t|| || dd|d	 t	t
|}tt
|D ]}
t|d d |
f ||
< qt|t|j|d tt|t|t|  d S )Nz
%r
%rTr   rn   r   gvIh%<=rtolatolerr_msggHz>)r   r   r   )r   r   r   r   )rD   rT   rG   rA   r	   r
   r   r   Zlexsortemptyrq   r1   r6   sizeallrE   r9   rb   rB   )r   r[   BB0msgr   r   wtZval1Zval2r   permZpermtlengthZbeta_nonzeroZwhresZw_finZwt_finr\   r\   r]   _check_gen_eig   sx      


" 
  
  zTestEig._check_gen_eigzSee gh-2254reasonc              
   C   s   t dddddgdddddgd	d
dddgdddddgdddddgg}t dddddgdddddgdddddgdddddgdddddgg}tjdd | || W 5 Q R X d S ) N   "         -   *         '   /   1               &   ,               .   (   %            #      ignorer   )r4   rT   errstater   r   r[   r   r\   r\   r]   test_singular   s    zTestEig.test_singularc              	   C   s   t tdddg}tdddgdddgdddgf}tdddgdddgdddgf}td}td}t||g|| gg}t||g||gg}tjdd | || W 5 Q R X d S )	Nrn   r   r{   rR   r   r{   r{   r   r   )r5   r4   r:   rG   rT   blockr   r   )r   MKDZZI3r[   r   r\   r\   r]   test_falker2  s      zTestEig.test_falkerc              	   C   sT   dd }t jdd6 tdD ]&}||d d d\}}| || qW 5 Q R X d S )Nc                 S   sv   d| d  }d|  }ddddgddddgdd|dgddd|gg}ddddgddddgddd| gdd|dgg}||fS )NrR   rn   r   r\   )omegaZc1c2r[   r   r\   r\   r]   matricesB  s    






z)TestEig.test_bad_geneig.<locals>.matricesr   r   d         @)r   )rT   r   r   r   )r   r   kr[   r   r\   r\   r]   test_bad_geneig?  s
    zTestEig.test_bad_geneigc                 C   st   t d td}| |d  td}| || tddtd  }| |d  tddtd  }| || d S )N  r{   r   rQ   )rK   rw   r   rL   r   r\   r\   r]   test_make_eigvalsV  s    zTestEig.test_make_eigvalsc           	      C   sn  dddgdddgdddgg}t |dd\}}dtd	 d d
dtd	 d g}tdddtd	d  d g}tdd
dg}tdddtd	d  d g}|t| }|t| }|t| }t|| t||d d d
f t|d   t||d d df t|d   t||d d df t|d   tdD ]4}t||d d |f  || |d d |f   q4d S )Nrn   rR   r{   r|   r}   Fr   r~   r   r   r   r   r   r   r   )r	   r?   r4   r1   r   rC   r   r   r\   r\   r]   test_check_finited  s    "
"""zTestEig.test_check_finitec                 C   s"   t ddd}ttt| dS )z:Check that passing a non-square array raises a ValueError.r}   r{   rR   N)rT   r;   reshapeassert_raises
ValueErrorr	   )r   r[   r\   r\   r]   test_not_square_erroru  s    zTestEig.test_not_square_errorc                 C   s:   t d}tddd}ttt|| ttt|| dS )zOCheck that passing arrays of with different shapes
        raises a ValueError.rR         "@r{   N)rG   rT   r;   r   r   r   r	   r   r\   r\   r]   test_shape_mismatchz  s    zTestEig.test_shape_mismatchN)r   r   r   r   r   r   r   r   pytestmarkxfailr   r   r   r   r   r   r   r\   r\   r\   r]   r      s   
	B
r   c                   @   st   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd ZdS )TestEigBandedc                 C   s   |    d S N)create_bandmatr   r\   r\   r]   setup_method  s    zTestEigBanded.setup_methodc                 C   s  d}d| _ d| _tt|dtt|d dd tt|d dd tt|d dd tt|d dd | _tt|dd	tt|d dd  d	tt|d dd  tt|d dd tt|d dd | _tt|dtt|d dd tt|d d
d tt|d dd tt|d dd | _d	tt|d tt|d dd d	tt|d d
d  tt|d dd tt|d dd | _t	| j\}}|j
}t|}|| | _|dd|f | _t	| j\}}|j
}t|}|| | _|dd|f | _| jd }t||ftd| _t||ftd| _t|D ]J}t| j|| j|| d ||f< t| j|| j|| d ||f< qJd| j  | j d }t||ftd| _t| j| jd| j  ddf< t| j D ]l}t| j|d | jd| j  d | |d |f< t| j| d | jd| j  d | d|d | f< qt||ftd| _t| j| jd| j  ddf< t| j D ]l}t| j|d | jd| j  d | |d |f< t| j| d | jd| j  d | d|d | f< qdt| | _| jd | _dS )zbCreate the full matrix `self.fullmat` and
           the corresponding band matrix `self.bandmat`.
   rR         ?rn         r   g       r   rQ         r`   NrH   r         ?      ?)KLKUr5   r7   sym_matherm_matreal_matcomp_matr8   r	   rc   r9   	w_sym_linevec_sym_lin
w_herm_linevec_herm_linr:   floatbandmat_symcomplexbandmat_hermr   bandmat_realbandmat_compr;   r   bc)r   NewevargsZLDABr   r\   r\   r]   r     s    


"&0,0,zTestEigBanded.create_bandmatc                 C   sP   t | jdd\}}}|ddt|f }tt|| j tt|t| j dS )zTCompare dsbev eigenvalues and eigenvectors with
           the result of linalg.eig.rn   	compute_vN)r+   r
  r9   r   rB   r  absr  r   r   evecinfoevec_r\   r\   r]   
test_dsbev  s    zTestEigBanded.test_dsbevc                 C   sP   t | jdd\}}}|ddt|f }tt|| j tt|t| j dS )zUCompare dsbevd eigenvalues and eigenvectors with
           the result of linalg.eig.rn   r  N)r,   r
  r9   r   rB   r  r  r  r  r\   r\   r]   test_dsbevd  s    zTestEigBanded.test_dsbevdc              	   C   sl   t | j\}}t| jddd|ddd\}}}}}|ddt|f }tt|| j tt|t| j	 dS )zUCompare dsbevx eigenvalues and eigenvectors
           with the result of linalg.eig.        rn   rR   r  r   N)
rA   r  r-   r
  r9   r   rB   r  r  r  r   r  r   r  numZifailr  r  r\   r\   r]   test_dsbevx  s     zTestEigBanded.test_dsbevxc                 C   sP   t | jdd\}}}|ddt|f }tt|| j tt|t| j dS )zUCompare zhbevd eigenvalues and eigenvectors
           with the result of linalg.eig.rn   r  N)r.   r  r9   r   rB   r  r  r  r  r\   r\   r]   test_zhbevd  s    zTestEigBanded.test_zhbevdc              	   C   sl   t | j\}}t| jddd|ddd\}}}}}|ddt|f }tt|| j tt|t| j	 dS )zUCompare zhbevx eigenvalues and eigenvectors
           with the result of linalg.eig.r  rn   rR   r  N)
rA   r  r/   r  r9   r   rB   r  r  r  r  r\   r\   r]   test_zhbevx  s     zTestEigBanded.test_zhbevxc                 C   sn  t | j}|j}tt|| j t | j}|j}tt|| j d}t	d}t | jd||fd}tt|| j||d   t | jd||fd}tt|| j||d   | j| d }| j| d }t | jd||fd}	tt|	| j||d   | j| d }| j| d }t | jd||fd}
tt|
| j||d   t | jdd	}|j}tt|| j d
S )z?Compare eigenvalues of eigvals_banded with those of linalg.eig.rR   r}   r   selectselect_rangern   h㈵>ru   Fr   N)
r   r
  rc   r   rB   r  r  r  rT   Zlonglong)r   w_symw_hermind1ind2	w_sym_ind
w_herm_indv_lowerv_upper	w_sym_val
w_herm_valr\   r\   r]   test_eigvals_banded  sV    


   z!TestEigBanded.test_eigvals_bandedc                 C   s  t | j\}}|ddt|jf }tt|| j tt|t| j t | j	\}}|ddt|jf }tt|| j
 tt|t| j d}d}t | jd||fd\}	}
tt|	| j||d   tt|
t| jdd||d f  t | j	d||fd\}}tt|| j
||d   tt|t| jdd||d f  | j| d }| j| d }t | jd||fd\}}tt|| j||d   tt|t| jdd||d f  | j
| d }| j
| d }t | j	d||fd\}}tt|| j
||d   tt|t| jdd||d f  t | jd	d
\}}|ddt|jf }tt|| j tt|t| j dS )zXCompare eigenvalues and eigenvectors of eig_banded
           with those of linalg.eig. NrR   r}   r   r$  rn   r'  ru   Fr   )r   r
  r9   rc   r   rB   r  r  r  r  r  r  )r   r(  Zevec_symZ	evec_sym_r)  Z	evec_hermZ
evec_herm_r*  r+  r,  Zevec_sym_indr-  Zevec_herm_indr.  r/  r0  Zevec_sym_valr1  Zevec_herm_valr\   r\   r]   test_eig_banded0  st    



zTestEigBanded.test_eig_bandedc                 C   s   t | j\}}t| j| j| j\}}}t|d| j ddf }t| j| j D ]4}|t|d| j d | |d |f |d 7 }qPt| jdd\}}	}
t	||
 dS )zZCompare dgbtrf  LU factorisation with the LU factorisation result
           of linalg.lu.rR   Nrn   r   Z	permute_l)
rA   r  r'   r  r   r   r5   r   r   r   r   r   r  lu_symm_bandipivr  ur   Zp_linZl_linZu_linr\   r\   r]   test_dgbtrfj  s    2zTestEigBanded.test_dgbtrfc                 C   s   t | j\}}t| j| j| j\}}}t|d| j ddf }t| j| j D ]4}|t|d| j d | |d |f |d 7 }qPt| jdd\}}	}
t	||
 dS )zZCompare zgbtrf  LU factorisation with the LU factorisation result
           of linalg.lu.rR   Nrn   r   r4  )
rA   r  r)   r  r   r   r5   r   r   r   r5  r\   r\   r]   test_zgbtrfx  s    2zTestEigBanded.test_zgbtrfc                 C   sP   t | j| j| j\}}}t|| j| j| j|\}}t| j| j}t	|| dS )zhCompare dgbtrs  solutions for linear equation system  A*x = b
           with solutions of linalg.solve.N)
r'   r  r   r   r(   r   r8   r   r  r   r   r6  r7  r  yZy_linr\   r\   r]   test_dgbtrs  s    zTestEigBanded.test_dgbtrsc                 C   sP   t | j| j| j\}}}t|| j| j| j|\}}t| j| j}t	|| dS )zhCompare zgbtrs  solutions for linear equation system  A*x = b
           with solutions of linalg.solve.N)
r)   r  r   r   r*   r  r8   r   r  r   r;  r\   r\   r]   test_zgbtrs  s    zTestEigBanded.test_zgbtrsN)r   r   r   r   r   r  r  r!  r"  r#  r2  r3  r9  r:  r=  r>  r\   r\   r\   r]   r     s   Q*:
r   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestEigTridiagonalc                 C   s   |    d S r   )create_trimatr   r\   r\   r]   r     s    zTestEigTridiagonal.setup_methodc                 C   s   d}t |d| _t |d d| _t| jt| jd t| jd | _t| j\}}|j}t|}|| | _	|dd|f | _
dS )z>Create the full matrix `self.fullmat`, `self.d`, and `self.e`.r   r   rn   r   r   N)r7   rt   er5   Zfull_matr8   r	   rc   r9   r   r  )r   r  r  r  r  r\   r\   r]   r@    s    $
z TestEigTridiagonal.create_trimatc                 C   sx   t tt| j| jdd  t tt| j| jd  t tt| j| jdd t tt| j| jdd t tt| j| jddd	 dS )
zTest error conditions.Nr   rQ   r   lapack_driverfoor   r   r   r$  )r   r   r"   rt   rA  rr   r   r\   r\   r]   test_degenerate  s     z"TestEigTridiagonal.test_degeneratec           	   
   C   s"  dD ]&}t | j| j|d}tt|| j qdD ]}ttt | j| jdddd q0dD ]}t | j| jdd	t| jd
 f|d}tt|| j d}d}t | j| jd||f|d}tt|| j||d
   | j| d }| j| d }t | j| jd||f|d}tt|| j||d
   qTdS )z>Compare eigenvalues of eigvalsh_tridiagonal with those of eig.)sterfstevstebzstemrautorB  )rG  rH  rH  r   r   rC  r%  r&  rI  rJ  rK  r   rn   r%  r&  rC  rR   r}   r'  ru   N)	r"   rt   rA  r   rB   r   r   r   rq   )	r   driverr   Zw_indr*  r+  r.  r/  Zw_valr\   r\   r]   test_eigvalsh_tridiagonal  sL              z,TestEigTridiagonal.test_eigvalsh_tridiagonalc           	   	   C   s  t tt| j| jdd dD ]R}t| j| j|d\}}|ddt|f }tt|| j tt	|t	| j
 qt tt| j| jdddd d	D ]@}d
}t| jd }t| j| jd||f|d\}}tt|| j tt	|t	| j
 d}d}t| j| jd||f|d\}}tt|| j||d   tt	|t	| j
dd||d f  | j| d }| j| d }t| j| jd||f|d\}}tt|| j||d   tt	|t	| j
dd||d f  qdS )zWCompare eigenvalues and eigenvectors of eigh_tridiagonal
           with those of eig. rG  rB  )rI  rH  rJ  rK  NrH  r   r   rL  rM  r   rn   rN  rR   r}   r'  ru   )r   r   r#   rt   rA  r9   r   rB   r   r  r  rq   )	r   rO  r   r  r  r*  r+  r.  r/  r\   r\   r]   test_eigh_tridiagonal  sf      
   
   
   
z(TestEigTridiagonal.test_eigh_tridiagonalN)r   r   r   r   r@  rF  rP  rQ  r\   r\   r\   r]   r?    s
   "r?  c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Ze	j
dee	j
dddd Ze	j
dde	j
dddd Zdd Ze	j
deegdd Zdd ZdS )TestEighc                 C   s   t d d S Nr   rK   r   r\   r\   r]   setup_class  s    zTestEigh.setup_classc              
   C   sn  t tttddg t tttddgtddg t tttddgtddg t tttddgtddgdd t tttddgtddgddgddgd tj B}|td t tttddgtddgddgddgd W 5 Q R X t tttddgtddgd	dgd
 tj <}|td t tttddgtddgd	dgd W 5 Q R X t tttddgtddgddgd
 tj <}|td t tttddgtddgddgd W 5 Q R X t tttddgtddgdd	gd
 tj <}|td t tttddgtddgdd	gd
 W 5 Q R X t tttddgtddgdd	gd t tttddgdd t tttddgd dd t tttddgtddgddd t tttddgtddgdddgdd tj @}|td t tttddgtddgdddgdd W 5 Q R X d S )Nrn   rR   r{      )type)subset_by_valuesubset_by_indexzKeyword argument 'eigvals)rX  r
   r   rY  r
   r   rX  ZwrongrO  gvxevrF)rO  turbogvd)rO  rY  r`  z 'eigh' keyword argument 'eigvals)	r   r   r   rT   r6   testingsuppress_warningsfilterDeprecationWarning)r   supr\   r\   r]   test_wrong_inputs  sz    ""       zTestEigh.test_wrong_inputsc                 C   s&   t tttddgtddg d S )Nr{   )r   r&   r   rT   r6   r   r\   r\   r]   test_nonpositive_bF  s    zTestEigh.test_nonpositive_bc                 C   s   t tD ]\}}td|d}t|ddgd\}}t|jd t| t|dk|dk @ s\ttdd|d}t||ddgd\}}t|jd t| t|dk|dk @ stqd S )	N   r   r   rR   r\  rn   T)rZ   rH   )		enumerateDTYPESr^   r   r   rA   rq   r   AssertionError)r   inddtrx   r   ru   r   r\   r\   r]   test_value_subsetsJ  s    zTestEigh.test_value_subsetsc                 C   sF   t ddgddgg}t ddgddgg}t|\}}t||\}}d S )Nrn   rR   r_   r{   r|   )r4   r   )r   rx   r   r   zr\   r\   r]   test_eigh_integerW  s    zTestEigh.test_eigh_integerc                 C   s>   dd l }|jd }t|}ttt| ttt| d S )Nr   rR   )	Zscipy.sparsesparseidentityZtocscrT   Z
atleast_2dr   r   r   )r   Zscipyrx   r   r\   r\   r]   test_eigh_of_sparse]  s
    
zTestEigh.test_eigh_of_sparsedtype_rO  )r  Zevdr_  Zevxc                 C   sH   t d|d}t||d\}}t|| ||  ddt|j dd d S )Nri  )rY   rH   r]  r    r   r   )r^   r   r   rT   re   eps)r   rO  ru  rx   r   ru   r\   r\   r]   test_various_drivers_standarde  s    z&TestEigh.test_various_drivers_standardrW  )rn   rR   r{   )gvra  r^  c                 C   s   t d}td}tddd}t||||d\}}|dkr\t|| |||   d|dd nJ|d	krt|| | ||  d|dd n t|| | ||  d|dd d S )
Ng     @ri  TrZ   )rx   r   rO  rW  rn   r  rw  rR   )rT   spacingr^   r   r   )r   rO  rW  r   rx   r   r   ru   r\   r\   r]    test_various_drivers_generalizedn  s    
""z)TestEigh.test_various_drivers_generalizedc                 C   s   t d}t|ddgd}tt|d t|ddgd}tt|d t|| tdddddg}t|ddgd	}tt|d t|tddg d S )
Nr|   rn   rR   rZ  333333?g?      ?gffffff?r\  )r^   r   r   rq   r   rT   r5   r4   )r   rx   r   Zw2r   Zw3r\   r\   r]   test_eigvalsh_new_args|  s    
zTestEigh.test_eigvalsh_new_argsmethodc              	   C   s`   t jtdd |tddd W 5 Q R X t jtdd |tdddgd	 W 5 Q R X d S )
NKeyword argument 'turbo')matchrR   rR   Tr`  Keyword argument 'eigvals'r   rn   r[  )r   Zwarnsre  rT   r:   )r   r  r\   r\   r]   test_deprecation_warnings  s    z"TestEigh.test_deprecation_warningsc              	   C   s   t d}t ddd}tj $}|td t||dd\}}W 5 Q R X t||dd\}}t|| t|| tj &}|td t|d	d
gd\}}W 5 Q R X t|d	d
gd\}}t|| t|| d S )Nr{   Tr{  r  r  ra  r]  r  r   rn   r[  rZ  )r^   rT   rb  rc  rd  re  r   r   )r   rx   r   rf  Zw_depZv_depr   ru   r\   r\   r]   test_deprecation_results  s    


z!TestEigh.test_deprecation_resultsN)r   r   r   rU  rg  rh  ro  rq  rt  r   r   parametrizerk  ry  r}  r  r   r   r  r  r\   r\   r\   r]   rR  
  s    8
rR  c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd ZdS ) TestLUc                 C   sX  t dddgdddgdddgg| _t dddgdddgdddgg| _t dddgdddgdd	d
gg| _t dddgdddgdddgg| _t ddddgdddd	gd
dddgg| _dt ddddgdddd	gd
dddgg | _t dddgdddgdd	d
gdddgg| _dt dddgdddgdd	d
gdddgg | _t	d| _
t	ddt	d  | _d S )Nrn   rR   r{   r|   r}                 @rV  r_      r~   rQ                  @              @y              @y              @y              @y               @y              "@r      )r   r   )r4   rx   car   cbhrectchrectvrectcvrectrL   medcmedr   r\   r\   r]   r     s"    """"(


*

zTestLU.setup_methodc                 C   sB   t |\}}}t|| | | t |dd\}}t|| | d S )Nrn   r4  )r   r   )r   dataplr8  plr\   r\   r]   _test_common  s    zTestLU._test_commonc                 C   sD   t |\}}td|f\}||dd\}}}t|| t|| d S )N)getrfFoverwrite_a)r   r0   r   )r   r  Zl_and_u1Zpiv1r  Zl_and_u2Zpiv2_r\   r\   r]   _test_common_lu_factor  s
    
zTestLU._test_common_lu_factorc                 C   s   |  | j d S r   )r  rx   r   r\   r\   r]   r     s    zTestLU.test_simplec                 C   s   |  | j d S r   )r  r  r   r\   r\   r]   r     s    zTestLU.test_simple_complexc                 C   s   |  | j d S r   )r  r   r   r\   r\   r]   test_simple2  s    zTestLU.test_simple2c                 C   s   |  | j d S r   )r  r  r   r\   r\   r]   test_simple2_complex  s    zTestLU.test_simple2_complexc                 C   s   |  | j | | j d S r   )r  r  r  r   r\   r\   r]   test_hrectangular  s    zTestLU.test_hrectangularc                 C   s   |  | j | | j d S r   )r  r  r  r   r\   r\   r]   test_vrectangular  s    zTestLU.test_vrectangularc                 C   s   |  | j | | j d S r   )r  r  r  r   r\   r\   r]   test_hrectangular_complex  s    z TestLU.test_hrectangular_complexc                 C   s   |  | j | | j d S r   )r  r  r  r   r\   r\   r]   test_vrectangular_complex  s    z TestLU.test_vrectangular_complexc                 C   s   |  | j | | j dS z:Check lu decomposition on medium size, rectangular matrix.N)r  r  r  r   r\   r\   r]   test_medium1  s    zTestLU.test_medium1c                 C   s   |  | j | | j dS r  )r  r  r  r   r\   r\   r]   test_medium1_complex  s    zTestLU.test_medium1_complexc                 C   s,   t | jdd\}}}t|| | | j d S )NFr   )r   rx   r   )r   r  r  r8  r\   r\   r]   r     s    zTestLU.test_check_finitec                 C   sd   dD ]Z}t jddgddgg|d}t|\}}t|t ddgddgg t|t ddg qd S )NCFrR   rn   r   r   order)rT   r4   r   r   r   )r   r  r[   LUPr\   r\   r]   test_simple_known  s
    zTestLU.test_simple_knownN)r   r   r   r   r  r  r   r   r  r  r  r  r  r  r  r  r   r  r\   r\   r\   r]   r    s   	r  c                   @   s   e Zd ZdZdd ZdS )TestLUSinglez0LU testers for single precision, real and doublec                 C   s   t |  | jt| _| jt| _| jt| _| jt| _| j	t| _	| j	t| _
| jt| _| jt| _| jt| _| jt| _d S r   )r  r   rx   rX   r<   r  r=   r   r  r  r  r  r  r  r  r   r\   r\   r]   r     s    
zTestLUSingle.setup_methodN)r   r   r   __doc__r   r\   r\   r\   r]   r    s   r  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestLUSolvec                 C   s   t d d S rS  rT  r   r\   r\   r]   r     s    zTestLUSolve.setup_methodc                 C   sR   t d}t d}dD ]8}tj||d}t||}t|}t||}t|| qd S )Nr   r   r   r  r  )rL   rT   r4   r   r   r   r   )r   Za0r   r  rx   x1lu_ax2r\   r\   r]   test_lu  s    

zTestLUSolve.test_luc                 C   sB   t d}t d}t||}t|dd}t||dd}t|| d S )Nr  r  Fr   )rL   r   r   r   r   )r   rx   r   r  r  r  r\   r\   r]   r   )  s    
zTestLUSolve.test_check_finiteN)r   r   r   r   r  r   r\   r\   r\   r]   r    s   r  c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zejje ddejjdd ZdS )TestSVD_GESDDc                 C   s   d| _ td d S )NZgesddr   rC  rK   r   r\   r\   r]   r   3  s    zTestSVD_GESDD.setup_methodc                 C   s,   t ttdggdd t ttdggdd d S )Nr   rB  rD  )r   rr   r   r   r   r\   r\   r]   rF  7  s    zTestSVD_GESDD.test_degeneratec                 C   s   dddgdddgdddgg}dD ]}t ||| jd\}}}t|j| td t|j| td t|jd	 |jd	 f|jj}t	t
|D ]}|| |||f< qt|| | | q d S )
Nrn   rR   r{   ri  r|   r}   TFfull_matricesrC  r   r   rC  r   rW   rG   r:   rA   rH   charr   rq   r   rx   r  r8  svhsigmar   r\   r\   r]   r   ;  s    zTestSVD_GESDD.test_simplec                 C   s   dddgdddgdddgg}dD ]}t ||| jd\}}}t|j| td t|j| td t|jd |jd f|jj}t	t
|D ]}|| |||f< qt|| | | q d S )	Nrn   rR   r{   r|   r}   r  r  r   r  r  r\   r\   r]   test_simple_singularG  s    z"TestSVD_GESDD.test_simple_singularc                 C   s   dddgdddgg}dD ]}t ||| jd\}}}t|j| t|jd	  t|jd	 |jd	 f|jj}t	t
|D ]}|| |||f< qvt|| | | qd S )
Nrn   rR   r{   rV  r|   r}   r  r  r   r   rC  r   rW   rG   rA   r:   rH   r  r   rq   r  r\   r\   r]   test_simple_underdetS  s    z"TestSVD_GESDD.test_simple_underdetc                 C   s   ddgddgddgg}dD ]}t ||| jd\}}}t|j| t|jd  t|j| td t|jd |jd f|jj}t	t
|D ]}|| |||f< qt|| | | qd S )	Nrn   rR   rV  r|   r{   r  r  r   r  r  r\   r\   r]   test_simple_overdet^  s    z!TestSVD_GESDD.test_simple_overdetc           
      C   s   d}d}t dD ]}t||gt||gfD ]}dD ]}t||| jd\}}}t|j| t|jd  t||j t|jd  t|jd |jd f|j	j
}	t t|D ]}|| |	||f< qt||	 | | q4q,qd S )Nri  r   r{   r  r  rn   r   )r   rL   r   rC  r   rW   rG   rA   r:   rH   r  rq   )
r   rY   mr   rx   r  r8  r  r  r  r\   r\   r]   test_randomj  s    zTestSVD_GESDD.test_randomc                 C   s   dddgdddgdddgg}dD ]}t ||| jd\}}}t| j| t|jd  t| j| t|jd	  t|jd	 |jd	 f|jj	}t
t|D ]}|| |||f< qt|| | | q d S )
Nrn   rR   r{   r  r|   r}   r  r  r   )r   rC  r   rV   rW   rG   rA   r:   rH   r  r   rq   r  r\   r\   r]   r   y  s    z!TestSVD_GESDD.test_simple_complexc           
      C   s   d}d}t dD ]}dD ]}t||gt||gfD ]}|dtt|j  }t||| jd\}}}t| j| t	|jd  t
|jd |jd f|jj}	t t|D ]}|| |	||f< qt||	 | | q4qqd S )	Nri  r   r{   r  rQ   r  rn   r   )r   rL   listrA   r   rC  r   rV   rW   rG   r:   rH   r  rq   )
r   rY   r  r   r  rx   r8  r  r  r  r\   r\   r]   test_random_complex  s     z!TestSVD_GESDD.test_random_complexc                 C   s^   dddg}t jd |D ]>}t jt jt jt jfD ]$}t jj| |}t	|| j
d q2qd S )N)r   r   )r   2   )<   r   r   rB  )rT   rL   rK   r<   float64r=   
complex128rU   rX   r   rC  )r   sizesszrn  rx   r\   r\   r]   test_crash_1580  s    
zTestSVD_GESDD.test_crash_1580c                 C   s   dddgdddgdddgg}t |d| jd\}}}t|j| td t|j| td t|jd	 |jd	 f|jj}t	t
|D ]}|| |||f< qt|| | | d S )
Nrn   rR   r{   ri  r|   r}   F)r   rC  r   r  )r   rx   r8  r  r  r  r   r\   r\   r]   r     s    zTestSVD_GESDD.test_check_finitec                 C   sT   t ddddddgddddddgddddddgddddddgg}t|| jd d S )NgK}\UU?gvWUU?r  rB  )rT   r4   r   rC  )r   r   r\   r\   r]   test_gh_5039  s    
zTestSVD_GESDD.test_gh_5039z64-bit LAPACK requiredr   c                 C   s`   t dd tjddgtjd}d|d< t|dd\}}}t|d	 d
 t|d |d  d
 d S )NihB  )Zfree_mbrn   l        r   rE  F)r  r   r   r   )rO   rT   r:   r<   r   r   )r   r[   r8  r  r  r\   r\   r]   test_large_matrix  s    
zTestSVD_GESDD.test_large_matrixN)r   r   r   r   rF  r   r  r  r  r  r   r  r  r   r  r   r   skipifrP   slowr  r\   r\   r\   r]   r  2  s   	
r  c                   @   s   e Zd Zdd ZdS )TestSVD_GESVDc                 C   s   d| _ td d S )Ngesvdr   r  r   r\   r\   r]   r     s    zTestSVD_GESVD.setup_methodN)r   r   r   r   r\   r\   r\   r]   r    s   r  c                   @   s\   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
ejjdd ZdS )TestSVDValsc                 C   s:   g gt dt dfD ]}t|}t|t d qd S )N)rR   r   )r   r{   r   )rT   r   r6   r   r   r   rx   r  r\   r\   r]   
test_empty  s    zTestSVDVals.test_emptyc                 C   s`   dddgdddgdddgg}t |}tt|dk t|d |d   koT|d kn   d S )Nrn   rR   r{   r|   r}   r   r   r   rq   r  r\   r\   r]   r     s    zTestSVDVals.test_simplec                 C   sD   dddgdddgg}t |}tt|dk t|d |d k d S )Nrn   rR   r{   rV  r|   r}   r   r  r  r\   r\   r]   r    s    z TestSVDVals.test_simple_underdetc                 C   sF   ddgddgddgg}t |}tt|dk t|d |d k d S )Nrn   rR   rV  r|   r{   r   r  r  r\   r\   r]   r    s    zTestSVDVals.test_simple_overdetc                 C   s`   dddgdddgdddgg}t |}tt|dk t|d |d   koT|d kn   d S )	Nrn   rR   r{   ri  r  r|   r}   r   r  r  r\   r\   r]   r     s    zTestSVDVals.test_simple_complexc                 C   sD   dddgdddgg}t |}tt|dk t|d |d k d S )Nrn   rR   r{   rV  r  r}   r   r  r  r\   r\   r]   test_simple_underdet_complex  s    z(TestSVDVals.test_simple_underdet_complexc                 C   sF   ddgddgddgg}t |}tt|dk t|d |d k d S )Nrn   rR   rV  r|   r  r   r  r  r\   r\   r]   test_simple_overdet_complex  s    z'TestSVDVals.test_simple_overdet_complexc                 C   sd   dddgdddgdddgg}t |dd}tt|dk t|d |d   koX|d kn   d S )	Nrn   rR   r{   r|   r}   Fr   r   r  r  r\   r\   r]   r     s    zTestSVDVals.test_check_finitec                 C   s&   t jd t jdd}t| d S )Nr   i  i
  )rT   rL   rK   rU   r   r   rx   r\   r\   r]   test_crash_2609  s    zTestSVDVals.test_crash_2609N)r   r   r   r  r   r  r  r   r  r  r   r   r   r  r  r\   r\   r\   r]   r    s   r  c                   @   s   e Zd Zdd ZdS )TestDiagSVDc                 C   s4   t tdddgdddddgdddgdddgg d S )Nrn   r   r{   )r   r   r   r\   r\   r]   r     s    zTestDiagSVD.test_simpleN)r   r   r   r   r\   r\   r\   r]   r    s   r  c                   @   s  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#dCdD Z$dEdF Z%dGdH Z&dIdJ Z'dKdL Z(dMdN Z)dOdP Z*dQdR Z+dSdT Z,dUdV Z-dWdX Z.dYdZ Z/d[d\ Z0d]d^ Z1d_d` Z2dadb Z3dcdd Z4dedf Z5dgdh Z6didj Z7dkS )lTestQRc                 C   s   t d d S rS  rT  r   r\   r\   r]   r     s    zTestQR.setup_methodc                 C   sN   dddgdddgdddgg}t |\}}t|j| td t|| | d S Nr  rR   r{   r~   r|   r}   r   r   rW   rG   r   rx   qrr\   r\   r]   r     s    zTestQR.test_simplec                 C   s|   dddgdddgdddgg}t |\}}dddg}t||d\}}t|| | t|| t|tdd\}}t|| d S )	Nr  rR   r{   r~   r|   r}   rn   r   r   r   r   rG   r   rx   r  r  cqcr2r\   r\   r]   test_simple_left  s    

zTestQR.test_simple_leftc                 C   sx   dddgdddgdddgg}t |\}}dddg}t||\}}t|| | t|| t|td\}}t|| d S )Nr  rR   r{   r~   r|   r}   rn   r  r  r\   r\   r]   test_simple_right"  s    

zTestQR.test_simple_rightc                 C   s   t dddgdddgdddgg}t|dd\}}}tt|}tt |d	d  |d d
 k t|j| t	d t|| |d d |f  t|d d |f \}}t|| t|| d S )Nr  rR   r{   r~   r|   r}   Tpivotingrn   r   
rT   rD   r   r  r5   r   r   r   rW   rG   r   rx   r  r  r  rt   q2r  r\   r\   r]   test_simple_pivoting,  s    ""
zTestQR.test_simple_pivotingc                 C   s^   dddgdddgdddgg}t |dd\}}}d	ddg}t||d
d\}}}t|| | d S )Nr  rR   r{   r~   r|   r}   Tr  rn   r   r   r   r   r   rx   r  r  jpvtr  r  r\   r\   r]   test_simple_left_pivoting7  s
    
z TestQR.test_simple_left_pivotingc                 C   s^   dddgdddgdddgg}t |dd\}}}d	ddg}t||dd\}}}t|| | d S )
Nr  rR   r{   r~   r|   r}   Tr  rn   r  r  r\   r\   r]   test_simple_right_pivoting>  s
    
z!TestQR.test_simple_right_pivotingc                 C   sF   dddgdddgg}t |\}}t|j| td t|| | d S Nr  rR   r{   r~   r  r  r\   r\   r]   test_simple_trapE  s    zTestQR.test_simple_trapc                 C   s   t dddgdddgg}t|dd\}}}tt|}tt |dd  |d d k t|j| t	d t|| |d d |f  t|d d |f \}}t|| t|| d S )	Nr  rR   r{   r~   Tr  rn   r   r  r  r\   r\   r]   test_simple_trap_pivotingK  s    "
z TestQR.test_simple_trap_pivotingc                 C   sH   ddgddgddgg}t |\}}t|j| td t|| | d S Nr  rR   r~   r|   r{   r  r  r\   r\   r]   test_simple_tallV  s    zTestQR.test_simple_tallc                 C   s   t ddgddgddgg}t|dd\}}}tt|}tt |dd  |d d	 k t|j| t	d t|| |d d |f  t|d d |f \}}t|| t|| d S )
Nr  rR   r~   r|   r{   Tr  rn   r   r  r  r\   r\   r]   test_simple_tall_pivoting]  s    "
z TestQR.test_simple_tall_pivotingc                 C   sd   ddgddgddgg}t |dd\}}t|j| td t|| | t|jd t|jd	 d S )
Nr  rR   r~   r|   r{   economicmoder{   rR   r  r   r   rW   rG   r   rA   r  r\   r\   r]   test_simple_tall_ei  s    zTestQR.test_simple_tall_ec                 C   s   t ddgddgddgg}t|ddd\}}}tt|}tt |d	d  |d d
 k t|j| t	d t|| |d d |f  t|d d |f dd\}}t|| t|| d S )Nr  rR   r~   r|   r{   Tr  r  r  rn   r   r  r  r  r\   r\   r]   test_simple_tall_e_pivotingr  s    "
z"TestQR.test_simple_tall_e_pivotingc                 C   s   ddgddgddgg}t |dd\}}ddg}t||d	\}}t|| | t|| tddd
g}t||d	dd\}}t||d d  | t|tdd	\}}t|| d S )Nr  rR   r~   r|   r{   r  r  rn   r   r   TZoverwrite_cr   r   r   r4   rG   r  r\   r\   r]   test_simple_tall_left~  s    
zTestQR.test_simple_tall_leftc                 C   s   ddgddgddgg}t |ddd\}}}d	dg}t||d
d\}}}t|| t|| | t|tdd
d\}}}t|| d S )Nr  rR   r~   r|   r{   r  Tr  r  rn   r   )r   r   r   r   rG   )r   rx   r  r  r  r  r  Zkpvtr\   r\   r]   test_simple_tall_left_pivoting  s    
z%TestQR.test_simple_tall_left_pivotingc                 C   sv   ddgddgddgg}t |dd\}}dddg}t||\}}t|| | t|| t|td\}}t|| d S )	Nr  rR   r~   r|   r{   r  r  rn   r  r   rx   r  r  r  cqr  r\   r\   r]   test_simple_tall_right  s    

zTestQR.test_simple_tall_rightc                 C   s|   ddgddgddgg}t |ddd\}}}d	ddg}t||dd
\}}}t|| | t|tddd
\}}}t|| d S )Nr  rR   r~   r|   r{   Tr  r	  rn   r  r  r   rx   r  r  r  r  r  r\   r\   r]   test_simple_tall_right_pivoting  s    
z&TestQR.test_simple_tall_right_pivotingc                 C   s^   dddgdddgg}t |\}}t|j| td t|| | t|jd t|jd d S )Nr  rR   r|   r~   r{   r  rR   r{   r  r  r\   r\   r]   test_simple_fat  s    zTestQR.test_simple_fatc                 C   s   t dddgdddgg}t|dd\}}}tt|}tt |dd  |d d	 k t|j| t	d t|| |d d |f  t
|jd
 t
|jd t|d d |f \}}t|| t|| d S )Nr  rR   r|   r~   r{   Tr  rn   r   r  r  rT   rD   r   r  r5   r   r   r   rW   rG   r   rA   r  r\   r\   r]   test_simple_fat_pivoting  s    "
zTestQR.test_simple_fat_pivotingc                 C   sb   dddgdddgg}t |dd\}}t|j| td t|| | t|jd t|jd	 d S )
Nr  rR   r{   r~   r|   r  r  r  r  r  r  r\   r\   r]   test_simple_fat_e  s    zTestQR.test_simple_fat_ec                 C   s   t dddgdddgg}t|ddd\}}}tt|}tt |d	d  |d d
 k t|j| t	d t|| |d d |f  t
|jd t
|jd t|d d |f dd\}}t|| t|| d S )Nr  rR   r{   r~   r|   Tr  r	  rn   r   r  r  r  r  r  r\   r\   r]   test_simple_fat_e_pivoting  s    "
z!TestQR.test_simple_fat_e_pivotingc                 C   sv   dddgdddgg}t |dd\}}ddg}t||d	\}}t|| | t|| t|tdd	\}}t|| d S )
Nr  rR   r{   r~   r|   r  r  rn   r   r  r  r\   r\   r]   test_simple_fat_left  s    
zTestQR.test_simple_fat_leftc                 C   sx   dddgdddgg}t |ddd\}}}d	dg}t||d
d\}}}t|| | t|tdd
d\}}}t|| d S )Nr  rR   r{   r~   r|   r  Tr  rn   r   r  r  r\   r\   r]   test_simple_fat_left_pivoting  s    z$TestQR.test_simple_fat_left_pivotingc                 C   sr   dddgdddgg}t |dd\}}ddg}t||\}}t|| | t|| t|td\}}t|| d S )	Nr  rR   r{   r~   r|   r  r  rn   r  r  r\   r\   r]   test_simple_fat_right  s    
zTestQR.test_simple_fat_rightc                 C   sx   dddgdddgg}t |ddd\}}}d	dg}t||dd
\}}}t|| | t|tddd
\}}}t|| d S )Nr  rR   r{   r~   r|   Tr  r	  rn   r  r  r  r\   r\   r]   test_simple_fat_right_pivoting  s    z%TestQR.test_simple_fat_right_pivotingc                 C   sR   dddgdddgdddgg}t |\}}t| j| td t|| | d S Nr{         @      @r|   rR          @      @r_   )r   r   rV   rW   rG   r  r\   r\   r]   r     s    zTestQR.test_simple_complexc                 C   sr   dddgdddgdddgg}t |\}}dddg}t||d\}}t|| | t|tdd\}}t|| d S )	Nr{   r   r|   rR   r!  r_   rn   r   r  r   rx   r  r  r  r  r\   r\   r]   test_simple_complex_left  s    
zTestQR.test_simple_complex_leftc                 C   sn   dddgdddgdddgg}t |\}}dddg}t||\}}t|| | t|td\}}t|| d S )Nr{   r   r|   rR   r!  r_   rn   r  r"  r\   r\   r]   test_simple_complex_right  s    
z TestQR.test_simple_complex_rightc                 C   s   ddgddgddgg}t |dd\}}d	d
g}t||d\}}t|| | t|| td	ddg}t||ddd\}}t||d d  | t|tdd\}}t|| d S )Nr  y       @      @rR   r~   y      @      @r{   r  r  rn          @       @r   r   Tr  r  r  r\   r\   r]   test_simple_tall_complex_left  s    
z$TestQR.test_simple_tall_complex_leftc                 C   s\   dddgdddgdddgg}t |\}}dddg}t||dd	d
\}}t| | | d S )Nr{   r   r|   rR   r!  r_   rn   r   T	conjugater   r   r   rV   r"  r\   r\   r]   "test_simple_complex_left_conjugate!  s
    
z)TestQR.test_simple_complex_left_conjugatec                 C   sX   ddgddgddgg}t |dd\}}ddg}t||d	d
d\}}t| | | d S )Nr{   r   r|   r%  rR   r  r  rn   r   Tr'  r)  r"  r\   r\   r]   'test_simple_complex_tall_left_conjugate(  s
    z.TestQR.test_simple_complex_tall_left_conjugatec                 C   s`   dddgdddgdddgg}t |\}}tdddg}t||dd	\}}t||  | d S )
Nr{   r   r|   rR   r!  r_   rn   Tr'  )r   rT   r4   r   r   rV   r"  r\   r\   r]   #test_simple_complex_right_conjugate/  s
    z*TestQR.test_simple_complex_right_conjugatec                 C   s   t dddgdddgdddgg}t|dd\}}}tt|}tt|d	d  |d d
 k t| j	| t
d t|| |d d |f  t|d d |f \}}t|| t|| d S )Nr{   r   r|   rR   r!  r_   Tr  rn   r   )r4   r   r  r5   r   rT   r   r   rV   rW   rG   r  r\   r\   r]   test_simple_complex_pivoting6  s     "
z#TestQR.test_simple_complex_pivotingc                 C   sb   t dddgdddgdddgg}t|dd\}}}d	ddg}t||d
d\}}}t|| | d S )Nr{   r   r|   rR   r!  r_   Tr  rn   r   r4   r   r   r   r  r\   r\   r]   !test_simple_complex_left_pivotingA  s
     
z(TestQR.test_simple_complex_left_pivotingc                 C   sb   t dddgdddgdddgg}t|dd\}}}d	ddg}t||dd\}}}t|| | d S )
Nr{   r   r|   rR   r!  r_   Tr  rn   r.  r  r\   r\   r]   "test_simple_complex_right_pivotingH  s
     
z)TestQR.test_simple_complex_right_pivotingc                 C   sP   d}t dD ]>}t||g}t|\}}t|j| t| t|| | qd S Nri  rR   r   rL   r   r   rW   rG   r   rY   r   rx   r  r  r\   r\   r]   r  O  s    zTestQR.test_randomc                 C   st   d}t dD ]b}t||g}t|\}}t|g}t||d\}}t|| | t|t|d\}}t|| qd S )Nri  rR   r   r   rL   r   r   r   rG   r   rY   r   rx   r  r  r  r  r\   r\   r]   test_random_leftW  s    
zTestQR.test_random_leftc                 C   sp   d}t dD ]^}t||g}t|\}}t|g}t||\}}t|| | t|t|\}}t|| qd S r1  r4  r   rY   r   rx   r  r  r  r  r\   r\   r]   test_random_rightb  s    
zTestQR.test_random_rightc           
      C   s   d}t dD ]}t||g}t|dd\}}}tt|}tt|dd  |d d k t|j	| t
| t|| |d d |f  t|d d |f \}}	t|| t||	 qd S )Nri  rR   Tr  rn   r   r   rL   r   r  r5   r   rT   r   r   rW   rG   
r   rY   r   rx   r  r  r  rt   r  r  r\   r\   r]   test_random_pivotingm  s    "
zTestQR.test_random_pivotingc                 C   sT   d}d}t dD ]>}t||g}t|\}}t|j| t| t|| | qd S N   r   rR   r2  r   r  rY   r   rx   r  r  r\   r\   r]   test_random_tallz  s    zTestQR.test_random_tallc           	      C   s|   d}d}t dD ]f}t||g}t|dd\}}t|g}t||d\}}t|| | t|t|d\}}t|| qd S )Nr=  r   rR   r  r  r   r4  )	r   r  rY   r   rx   r  r  r  r  r\   r\   r]   test_random_tall_left  s    
zTestQR.test_random_tall_leftc           	      C   sx   d}d}t dD ]b}t||g}t|dd\}}t|g}t||\}}t|| | t|t|\}}t|| qd S Nr=  r   rR   r  r  r4  )	r   r  rY   r   rx   r  r  r  r  r\   r\   r]   test_random_tall_right  s    
zTestQR.test_random_tall_rightc                 C   s   d}d}t dD ]}t||g}t|dd\}}}tt|}tt|dd  |d d k t|j	| t
| t|| |d d |f  t|d d |f \}	}
t||	 t||
 qd S )Nr=  r   rR   Tr  rn   r   r9  r   r  rY   r   rx   r  r  r  rt   r  r  r\   r\   r]   test_random_tall_pivoting  s    "
z TestQR.test_random_tall_pivotingc                 C   sx   d}d}t dD ]b}t||g}t|dd\}}t|j| t| t|| | t|j||f t|j||f qd S rA  )r   rL   r   r   rW   rG   r   rA   r>  r\   r\   r]   test_random_tall_e  s    zTestQR.test_random_tall_ec                 C   s   d}d}t dD ]}t||g}t|ddd\}}}tt|}tt|dd  |d d k t|j	| t
| t|| |d d |f  t|j||f t|j||f t|d d |f dd	\}	}
t||	 t||
 qd S )
Nr=  r   rR   Tr  r	  rn   r   r  )r   rL   r   r  r5   r   rT   r   r   rW   rG   r   rA   rC  r\   r\   r]   test_random_tall_e_pivoting  s    "
z"TestQR.test_random_tall_e_pivotingc                 C   sT   d}d}t dD ]>}t||g}t|\}}t|j| t| t|| | qd S Nr   r=  rR   r2  r>  r\   r\   r]   test_random_trap  s    zTestQR.test_random_trapc                 C   s   d}d}t dD ]}t||g}t|dd\}}}tt|}tt|dd  |d d k t|j	| t
| t|| |d d |f  t|d d |f \}	}
t||	 t||
 qd S )Nr   r=  rR   Tr  rn   r   r9  rC  r\   r\   r]   test_random_trap_pivoting  s    "
z TestQR.test_random_trap_pivotingc                 C   sd   d}t dD ]R}t||gdt||g  }t|\}}t| j| t| t|| | qd S Nri  rR   rQ   )r   rL   r   r   rV   rW   rG   r3  r\   r\   r]   r    s    zTestQR.test_random_complexc                 C   s   d}t dD ]}t||gdt||g  }t|\}}t|gdt|g  }t||d\}}t|| | t|t|d\}}t|| qd S )Nri  rR   rQ   r   r4  r5  r\   r\   r]   test_random_complex_left  s    zTestQR.test_random_complex_leftc                 C   s   d}t dD ]|}t||gdt||g  }t|\}}t|gdt|g  }t||\}}t|| | t|t|\}}t|| qd S rJ  r4  r7  r\   r\   r]   test_random_complex_right  s    z TestQR.test_random_complex_rightc           
      C   s   d}t dD ]}t||gdt||g  }t|dd\}}}tt|}tt|dd  |d d k t|	 j
| t| t|| |d d |f  t|d d |f \}}	t|| t||	 qd S )Nri  rR   rQ   Tr  rn   r   )r   rL   r   r  r5   r   rT   r   r   rV   rW   rG   r:  r\   r\   r]   test_random_complex_pivoting  s    "
z#TestQR.test_random_complex_pivotingc                 C   sR   dddgdddgdddgg}t |dd\}}t|j| td t|| | d S 	Nr  rR   r{   r~   r|   r}   Fr   r  r  r\   r\   r]   r     s    zTestQR.test_check_finitec           
      C   s   dddgdddgdddgg}t |d d\}}t |dd\}}t|| t|| t |dd\}}t|| t|| t |d	d\}}	t|| t|	| ttt |fd
di ttt |fd
di d S )Nr  rR   r{   r~   r|   r}   )lworkr   r   rO  r   )r   r   r   	Exception)
r   rx   r  r  r  r  Zq3Zr3Zq4Zr4r\   r\   r]   
test_lwork  s    





zTestQR.test_lworkN)8r   r   r   r   r   r  r  r  r  r  r  r  r  r  r  r
  r  r  r  r  r  r  r  r  r  r  r  r  r   r#  r$  r&  r*  r+  r,  r-  r/  r0  r  r6  r8  r;  r?  r@  rB  rD  rE  rF  rH  rI  r  rK  rL  rM  r   rQ  r\   r\   r\   r]   r    sj   

	

			
	
			
	r  c                   @   s|   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd ZdS )TestRQc                 C   s   t d d S rS  rT  r   r\   r\   r]   r   -  s    zTestRQ.setup_methodc                 C   sN   dddgdddgdddgg}t |\}}t||j td t|| | d S r  r   r   rW   rG   r   rx   r  r  r\   r\   r]   r   0  s    zTestRQ.test_simplec                 C   sB   dddgdddgdddgg}t |\}}t |dd}t|| d S )	Nr  rR   r{   r~   r|   r}   r  r  )r   r   )r   rx   r  r  r  r\   r\   r]   test_r6  s    zTestRQ.test_rc                 C   sP   d}t dD ]>}t||g}t|\}}t||j t| t|| | qd S r1  r   rL   r   r   rW   rG   r   rY   r   rx   r  r  r\   r\   r]   r  <  s    zTestRQ.test_randomc                 C   sF   dddgdddgg}t |\}}t|j| td t|| | d S r  rS  rT  r\   r\   r]   r  D  s    zTestRQ.test_simple_trapc                 C   sH   ddgddgddgg}t |\}}t|j| td t|| | d S r   rS  rT  r\   r\   r]   r  J  s    zTestRQ.test_simple_tallc                 C   sF   dddgdddgg}t |\}}t||j td t|| | d S )Nr  rR   r|   r~   r{   rS  rT  r\   r\   r]   r  P  s    zTestRQ.test_simple_fatc                 C   sR   dddgdddgdddgg}t |\}}t|| j td t|| | d S r  )r   r   rV   rW   rG   rT  r\   r\   r]   r   V  s    zTestRQ.test_simple_complexc                 C   sT   d}d}t dD ]>}t||g}t|\}}t||j t| t|| | qd S r<  rV  r   r  rY   r   rx   r  r  r\   r\   r]   r?  \  s    zTestRQ.test_random_tallc                 C   sT   d}d}t dD ]>}t||g}t|\}}t||j t| t|| | qd S rG  rV  rX  r\   r\   r]   rH  e  s    zTestRQ.test_random_trapc                 C   sx   d}d}t dD ]b}t||g}t|dd\}}t||j t| t|| | t|j||f t|j||f qd S )Nr   r=  rR   r  r  )r   rL   r   r   rW   rG   r   rA   rX  r\   r\   r]   test_random_trap_economicn  s    z TestRQ.test_random_trap_economicc                 C   sd   d}t dD ]R}t||gdt||g  }t|\}}t|| j t| t|| | qd S rJ  )r   rL   r   r   rV   rW   rG   rW  r\   r\   r]   r  y  s    zTestRQ.test_random_complexc                 C   s   d}d}t dD ]v}t||gdt||g  }t|dd\}}t|| j t| t|| | t|j||f t|j||f qd S )Nr   r=  rR   rQ   r  r  )	r   rL   r   r   rV   rW   rG   r   rA   rX  r\   r\   r]   test_random_complex_economic  s    z#TestRQ.test_random_complex_economicc                 C   sR   dddgdddgdddgg}t |dd\}}t||j td t|| | d S rN  rS  rT  r\   r\   r]   r     s    zTestRQ.test_check_finiteN)r   r   r   r   r   rU  r  r  r  r  r   r?  rH  rY  r  rZ  r   r\   r\   r\   r]   rR  +  s   		rR  c                   @   s   e Zd Zdd Zdd Zejdde	d de	dd	gfd
e	dd	e	d dgfddd	e	de	d gfde	de	d dd	gfdd e	dd	e	d dgfgdd Z
dd Zdd ZdS )	TestSchurc                 C   sN   t || | j |||dd t || j tt| dd|dd d S )Nz&Schur decomposition does not match 'a'r   r   zu is not unitary)r   rV   rW   rT   rG   rq   )r   rx   tr8  r   r   r\   r\   r]   check_schur  s    "zTestSchur.check_schurc                 C   s   dddgdddgdddgg}t |\}}| j|||dd	d
 t |d\}}tttt|onttt| | j|||dd	d
 t||\}}| j|||dd	d
 d S )Nr  r  r{   rR   r~   r   r}   +=+<r   r   r  )r   r]  r   rT   anyr>   r@   r   )r   rx   r\  rp  ZtcZzcZtc2Zzc2r\   r\   r]   r     s    (zTestSchur.test_simplezsort, expected_diaglhprR         ro   rhpiucoucc                 C   s   | dkS )Nr  r\   )ri   r\   r\   r]   <lambda>      zTestSchur.<lambda>c                 C   st   ddddgddddgddd	d
gddddgg}t ||d\}}}| j|||ddd tt||dd td| d S )N      @r   r   r               r         @            @r         @rB   r^  r_  r`  -q=r   rR   )r   r]  r   rT   r5   r   )r   rB   Zexpected_diagrx   r\  r8  Zsdimr\   r\   r]   	test_sort  s    



zTestSchur.test_sortc                 C   sP   ddddgddddgddd	d
gddddgg}t tt|dd t tt|dd d S )Nri  r   r   r   rj  rk  r   rl  rm  rn  r   ro  unsupportedrp  rn   )r   r   r   r  r\   r\   r]   test_sort_errors  s    



zTestSchur.test_sort_errorsc                 C   sH   dddgdddgdddgg}t |dd	\}}t|| | j | d S )
Nr  r  r{   rR   r~   r   r}   Fr   )r   r   rV   rW   )r   rx   r\  rp  r\   r\   r]   r     s    zTestSchur.test_check_finiteN)r   r   r   r]  r   r   r   r  rT   r?   rs  ru  r   r\   r\   r\   r]   r[    s   	
 
r[  c                   @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )TestHessenbergc                 C   sn   dddgdddgddd	gg}d
ddgdddgdddgg}t |dd\}}t|j| | | t||dd d S )Nkf     "  r        bsE@㥛 c(m̀kwc@fjWr   &S?,eX@rn   calc_qrV  decimalr   r   rW   r   rx   h1rv   r  r\   r\   r]   r     s    zTestHessenberg.test_simplec                 C   sH   dddgdddgddd	gg}t |d
d\}}t| j| | | d S )Nrw  rx  ry  rz  y             f@r|  y             ;r   r~  rn   r  )r   r   rV   rW   r   rx   rv   r  r\   r\   r]   r     s    z"TestHessenberg.test_simple_complexc                 C   s   dddddddgdddddddgdddddddgdddd	dddgdddddddgdddddddgdddddddgg}t |dd
\}}t|j| | | d S )Nrn   rR   r{   rV  r|   r}   r_   r   r  r  r  r  r\   r\   r]   r    s    zTestHessenberg.test_simple2c                 C   s:   t d}d|d< t|dd\}}t|j| | | d S )Nr{   rR   )r   r   rn   r  )rT   rG   r   r   rW   r  r\   r\   r]   test_simple3  s    
zTestHessenberg.test_simple3c                 C   sF   d}t dD ]4}t||g}t|dd\}}t|j| | | qd S )Nri  rR   rn   r  )r   rL   r   r   rW   r   rY   r   rx   rv   r  r\   r\   r]   r    s
    zTestHessenberg.test_randomc                 C   sZ   d}t dD ]H}t||gdt||g  }t|dd\}}t| j| | | qd S )Nri  rR   rQ   rn   r  )r   rL   r   r   rV   rW   r  r\   r\   r]   r    s
    z"TestHessenberg.test_random_complexc                 C   sp   dddgdddgddd	gg}d
ddgdddgdddgg}t |ddd\}}t|j| | | t||dd d S )Nrw  rx  ry  rz  r{  r|  r}  r   r~  r  r  r  r  r  r  r   r  r  rn   F)r  r   rV  r  r  r  r\   r\   r]   r     s    z TestHessenberg.test_check_finitec                 C   sx   ddgddgg}t |dd\}}t|td t|| ddgdd	gg}t |dd\}}t|td t|| d S )
NrR   rn   r_   r  r  y       @      r   y      @      @y      (@       )r   r   rT   rG   )r   rx   rv   r  r   h2r  r\   r\   r]   test_2x2  s    
zTestHessenberg.test_2x2N)r   r   r   r   r   r  r  r  r  r   r  r\   r\   r\   r]   rv    s   rv  c                   @   sb   e Zd Zdd Zejjejdkdddd Z	dd	 Z
d
d Zdd Zdd Zdd Zdd ZdS )TestQZc                 C   s   t d d S Ni90  rT  r   r\   r\   r]   r     s    zTestQZ.setup_methoddarwinz8gges[float32] broken for OpenBLAS on macOS, see gh-16949r   c                 C   s   d}t ||gt}t ||gt}t||\}}}}t|| |j |dd t|| |j |dd t||j t|dd t||j t|dd tt	t
|dk d S )Nr|   r  r   )rL   rX   r<   r   r   rW   rG   r   rT   r   r5   r   rY   r[   r   AABBQr   r\   r\   r]   test_qz_single  s    zTestQZ.test_qz_singlec                 C   s   d}t ||g}t ||g}t||\}}}}t|| |j | t|| |j | t||j t| t||j t| ttt|dk d S )Nr|   r   	rL   r   r   rW   rG   r   rT   r   r5   r  r\   r\   r]   test_qz_double&  s    zTestQZ.test_qz_doublec                 C   s   d}t ||gdt ||g  }t ||gdt ||g  }t||\}}}}t|| | j | t|| | j | t|| j t| t|| j t| ttt	|dk ttt	|j
dk d S )Nr|   rQ   r   )rL   r   r   rV   rW   rG   r   rT   r   r5   rd   r  r\   r\   r]   test_qz_complex1  s    zTestQZ.test_qz_complexc                 C   s   d}t ||gdt ||g  t}t ||gdt ||g  t}t||\}}}}t|| | j |dd t|| | j |dd t|| j t|dd t|| j t|dd tt	
t|dk tt	
t|jdk d S )Nr|   rQ   r  r   )rL   rX   r=   r   r   rV   rW   rG   r   rT   r   r5   rd   r  r\   r\   r]   test_qz_complex64=  s    ""zTestQZ.test_qz_complex64c           
      C   s   d}t ||g}t ||g}t||dd\}}}}|| | j }t|j| t|jd || | j }	t|	j| t|	jd t|| j t| t|| j t| tt	
t|dk d S )Nr|   r  )outputr   )rL   r   rV   rW   r   rc   rd   rG   r   rT   r   r5   )
r   rY   r[   r   r  r  r  r   aaZbbr\   r\   r]   test_qz_double_complexI  s    zTestQZ.test_qz_double_complexc              	   C   s~   t ddddgddddgdd	d
dgddddgg}t ddddgddddgddddgddddgg}ttt||dd d d S )N333333@      )@     @Ag      @333333@     5@     G      @r       Ero  皙@rl        Gr   r   r   g      r`   rm  r~  ri  c                 S   s   |dkS )Nr   r\   )rh   Zaibetar\   r\   r]   rg  p  rh  z,TestQZ.test_qz_double_sort.<locals>.<lambda>rp  )rT   r4   r   r   r   r   r   r   r\   r\   r]   test_qz_double_sortX  s    





zTestQZ.test_qz_double_sortc                 C   s   d}t ||g}t ||g}t||dd\}}}}t|| |j | t|| |j | t||j t| t||j t| ttt|dk d S )Nr|   Fr   r   r  r  r\   r\   r]   r     s    zTestQZ.test_check_finiteN)r   r   r   r   r   r   r   sysplatformr  r  r  r  r  r  r   r\   r\   r\   r]   r    s   
cr  c                 C   s   t | |  S r   )rT   rC   )Xr\   r\   r]   	_make_pos  s    r  c                   @   sp   e Zd Zedd Zdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd ZdS )	TestOrdQZc           
   	   C   sv  t ddddgddddgd	d
ddgddddgg}t ddddgddddgddddgdddd gg}t d!d"d#d$gd%d&d'd(gd%d&d)d*gd+d,d-d.gg}t d/d0d1d/gd/d2d3d4gd/d2d5d2gd/d2d5d4gg}t d6d7d8d8gd9d9d:d;gd;d9d7d8gd<d9d=d;gg}t d=d>d.d>gd;d;d:d?gd?d7d.d.gd6d7d9d;gg}t d0}t d@d/g}t d/d@g}	|||||	g| _|||||	g| _d S )ANy5     6y     J@     @Iy     @A     _@y      @      ?yq=
ףpݿQy           By      /     @M@y      %      y333333@      yC@1y      Q      )@y            y      @@y,@fffffE@y     @@      Gy      3     @@y      ?      y?333333?y              y              y?333333y              y            @y333333	y      ?        y333333@?y            y              rQ   y333333@y              y      @      r  r  r  rc  r  r  r  r  r  ro  r  g      :@r  rl  rn   rR   r{   rV  r   r   r   ri  r`   g      @r  g       @g      $@r   r   )rT   r4   rG   r5   r[   r   )
clsA1B1A2B2A3B3A4B4A5r\   r\   r]   rU    sV    
	















zTestOrdQZ.setup_classc              	      s<   t jdd"  fddt| j| jD }W 5 Q R X t|S )Nraiser   c                    s   g | ]\}}t || d qS )rp  )r   ).0AiBirp  r\   r]   
<listcomp>	  s     z'TestOrdQZ.qz_decomp.<locals>.<listcomp>)rT   r   zipr[   r   tuple)r   rB   retr\   rp  r]   	qz_decomp	  s    &zTestOrdQZ.qz_decompc
                 C   sv  t j|j }
t||j  |
 t|	|	j  |
 t|| ||	  t|| ||	  tt |dt |j tt |dt |j t	|jd D ]|}|dkr|||d f dkrq||jd d k r||d |f dkrt
|||d ||d f |||d ||d f \}}|d jdk rB|ddg }|||d  |||d   }|d jdk r~|ddg }t|| q|| dkr|| dkrt|||f d t|||f d q|| dkrt|||f d qt|||f |||f  || ||   qt|}d}t	|jd D ]<}|t || gt || g}|sj|rjt|}q4d S )Nr   r   r   rn   rR   T)rT   rG   rA   r   rW   rV   r   rJ   r:   r   r	   rd   r   r   r2   r4   rl  )r   r[   r   rB   r  r  alphar  r  r   ZIdr   Zevalsr  tmpZsortfunZlastsortZcursortr\   r\   r]   check		  s>    *> ,"
zTestOrdQZ.checkc                 C   s>   |  |}t|| j| jD ]\}}}| j|||f|  qd S r   )r  r  r[   r   r  )r   rB   r  Zretir  r  r\   r\   r]   	check_all7	  s    
zTestOrdQZ.check_allc                 C   s   |  d d S )Nrb  r  r   r\   r\   r]   test_lhp=	  s    zTestOrdQZ.test_lhpc                 C   s   |  d d S )Nrd  r  r   r\   r\   r]   test_rhp@	  s    zTestOrdQZ.test_rhpc                 C   s   |  d d S )Nre  r  r   r\   r\   r]   test_iucC	  s    zTestOrdQZ.test_iucc                 C   s   |  d d S )Nrf  r  r   r\   r\   r]   test_oucF	  s    zTestOrdQZ.test_oucc                 C   s   dd }|  | d S )Nc                 S   s>   t j| td}|dk}d|| < | | ||  jdk||< |S Nr   r   FrT   
empty_likeboolrd   ri   r<  ra   Znonzeror\   r\   r]   rB   K	  s
    
z TestOrdQZ.test_ref.<locals>.sortr  r   rB   r\   r\   r]   test_refI	  s    zTestOrdQZ.test_refc                 C   s   dd }|  | d S )Nc                 S   s>   t j| td}|dk}d|| < | | ||  jdk||< |S r  r  r  r\   r\   r]   rB   V	  s
    
z TestOrdQZ.test_cef.<locals>.sortr  r  r\   r\   r]   test_cefT	  s    zTestOrdQZ.test_cefc                 C   sx   t | jd | jd dd}| j| jd | jd df|  t | jd | jd dd}| j| jd | jd df|  d S )Nrn   rR   rb  rp  )r   r[   r   r  )r   r  r\   r\   r]   test_diff_input_types_	  s     zTestOrdQZ.test_diff_input_typesc                 C   s  t d}t ddg}dddgfdddgfdddgfdddgfg}t d}t d	d
g}dddgfdddgfdddgfdddgfg}t d}t ddg}ddt jgfddt jgfdt jdgfg}	t d}
t ddg}ddt jgfddt jgfdt jdgfg}t ddg}t ddg}ddt jgfddt jgfg}||||
|g}|||||g}|||	||g}t|||D ]\}}}|D ]\}}t|||d\}}}}}}|dk}|dk}t |}t j|||@ < t j|| |@ < ||  ||   || < t|| qqvd S )NrR   r   ro   rb  rc  rd  re  rf  y             ?y      ?      ?yٿɿ      ?      r   rn   rp  )	rT   rG   r5   r   nanr  r   r  r   )r   r  r  Z	expected1r  r  Z	expected2r  r  Z	expected3r  r  Z	expected4r  ZB5Z	expected5r[   r   expectedr  r  Z	expectediZsortstrZexpected_eigvalsr  r  r  ZazeroZbzerori   r\   r\   r]   test_sort_explicitf	  sX    












zTestOrdQZ.test_sort_explicitN)r   r   r   classmethodrU  r  r  r  r  r  r  r  r  r  r  r  r\   r\   r\   r]   r    s   
6.r  c                   @   s,   e Zd Zdd Zdd Zejjdd ZdS )TestOrdQZWorkspaceSizec                 C   s   t d d S r  rT  r   r\   r\   r]   r   	  s    z#TestOrdQZWorkspaceSize.setup_methodc                 C   s   d}t jt jfD ]<}t||f|}t||f|}t||dd dd}qt jt jfD ]<}t||f|}t||f|}t||dd dd}qZd S )N   c                 S   s   | |k S r   r\   r  r  r\   r\   r]   rg  	  rh  z7TestOrdQZWorkspaceSize.test_decompose.<locals>.<lambda>rc   )rB   r  c                 S   s   | |k S r   r\   r  r\   r\   r]   rg  	  rh  r  )rT   r<   r  rL   rX   r   r  r=   )r   r  ddtyper[   r   r  r\   r\   r]   test_decompose	  s    z%TestOrdQZWorkspaceSize.test_decomposec                 C   s`   d}t jt jt jt jfD ]B}t||f|}t||f|}t||dd\}}}}}	}
qd S )Nr  rf  rp  )rT   r<   r  r  r=   rL   rX   r   )r   r  r  r[   r   SrW   r  r  UVr\   r\   r]   test_decompose_ouc	  s
    z)TestOrdQZWorkspaceSize.test_decompose_oucN)	r   r   r   r   r  r   r   r  r  r\   r\   r\   r]   r  	  s   r  c                   @   s   e Zd Zdd ZdS )TestDatacopiedc                    s   ddl m} tddgddgg}t| | }| }G  fddd}G  fdd	d	}| }| }|d
f d
f|df|d
f|d
f|d
ffD ](\}	}
t|	}t|||	|
t|	d qd S )Nr   )_datacopiedrn   rR   r{   c                       s   e Zd Z fddZdS )z-TestDatacopied.test_datacopied.<locals>.Fake1c                    s    S r   r\   r   r[   r\   r]   	__array__	  s    z7TestDatacopied.test_datacopied.<locals>.Fake1.__array__N)r   r   r   r  r\   r  r\   r]   Fake1	  s   r  c                       s   e Zd Z jZdS )z-TestDatacopied.test_datacopied.<locals>.Fake2N)r   r   r   Z__array_interface__r\   r  r\   r]   Fake2	  s   r  FTr   )Zscipy.linalg._decompr  rN   rD   tolistr   r   repr)r   r  r   LZM2r  r  ZF1ZF2itemstatusZarrr\   r  r]   test_datacopied	  s$      zTestDatacopied.test_datacopiedN)r   r   r   r  r\   r\   r\   r]   r  	  s   r  c                  C   sF   t dtjd} tj| jddtd}d|_t|dd t|jdd d	S )
z4Check linalg works with non-aligned memory (float32)i  r   rR   r   offsetcountrH   r  Tr  N)	r;   rT   uint8
frombufferr  r<   rA   r	   rW   rx   rp  r\   r\   r]   test_aligned_mem_float	  s
    r  ppc64lezcrashes on ppc64ler   c                  C   sF   t dtjd} tj| jddtd}d|_t|dd t|jdd d	S )
z4Check linalg works with non-aligned memory (float64)i$  r   rV  r   r  r  Tr  N)	r;   rT   r  r  r  r	  rA   r	   rW   r  r\   r\   r]   test_aligned_mem	  s
    r  c                  C   sF   t dtjd} tj| jddtd}d|_t|dd t|jdd d	S )
z>Check that complex objects don't need to be completely alignediH  r   r  r   r  r  Tr  N)	r:   rT   r  r  r  r  rA   r	   rW   r  r\   r\   r]   test_aligned_mem_complex	  s
    r  c                 C   s   t |}tt|D ]}|d d  }t|| tjrtj|| j|| jj	 d tj
d}tj|jd|| j|| jd}|| j|_|| |d< |||< | || t|| jdkr|| j||< | || qd S )Nr  r   rV  r  .rn   )r  r   rq   rk   rT   rF   r:   r   rH   itemsizer  r  r  rA   rW   )funcr  kwargsr   rx   r  r\   r\   r]   check_lapack_misaligned	  s    &
r  z0Ticket #1152, triggers a segfault in rare cases.)runr   c            	      C   s  t jdtd} t d}d|_t jdt jd}t j|jddtd}d|_t d}t	|\}}t
|ftdd	ft|ftdd	ft|ftdd	ft	|ftdd	ft||f|ftdd
ft||ftdddft| ftdd	ft|ftdd	ft|ftdd	ft|ft ft|ftdd	ft| ftdd	ft|ftdd	ft|ftdd	ft|ftdd	ft|ftdd	ffD ]\}}}t||| qhd S )Nr   r   r   r  i N  rV  r  Tr  )overwrite_b)r  r  )rT   rG   r	  r;   rA   r  r  r  r6   r   r	   dictr
   r   r   r   r   r   r   r   r   r   r   r  )	r   Rr  r   r  pivr   r  r  r\   r\   r]   test_lapack_misaligned
  s4    

r  c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!S )"TestOverwritec                 C   s   t tdg t tddg d S Nr   )rM   r	   r   r\   r\   r]   test_eig3
  s    zTestOverwrite.test_eigc                 C   s   t tdg t tddg d S r
  )rM   r   r   r\   r\   r]   	test_eigh7
  s    zTestOverwrite.test_eighc                 C   s   t tdg d S Nr  )rM   r   r   r\   r\   r]   r3  ;
  s    zTestOverwrite.test_eig_bandedc                 C   s   t tdg d S r
  )rM   r
   r   r\   r\   r]   test_eigvals>
  s    zTestOverwrite.test_eigvalsc                 C   s   t tdg d S r
  )rM   r   r   r\   r\   r]   test_eigvalshA
  s    zTestOverwrite.test_eigvalshc                 C   s   t tdg d S r  )rM   r   r   r\   r\   r]   r2  D
  s    z!TestOverwrite.test_eigvals_bandedc                 C   s   t tdg d S r
  )rM   r   r   r\   r\   r]   test_hessenbergG
  s    zTestOverwrite.test_hessenbergc                 C   s   t tdg d S r
  )rM   r   r   r\   r\   r]   test_lu_factorJ
  s    zTestOverwrite.test_lu_factorc                    sB   t dddgdddgdddgg}t| t fd	d
dg d S )Nrn   rR   r{   rV  r|   r}   r_   r  c                    s
   t  | S r   )r   )r   Zxlur\   r]   rg  P
  rh  z-TestOverwrite.test_lu_solve.<locals>.<lambda>)r{   )rT   r4   r   rM   )r   ri   r\   r  r]   test_lu_solveM
  s    "zTestOverwrite.test_lu_solvec                 C   s   t tdg d S r
  )rM   r   r   r\   r\   r]   r  R
  s    zTestOverwrite.test_luc                 C   s   t tdg d S r
  )rM   r   r   r\   r\   r]   test_qrU
  s    zTestOverwrite.test_qrc                 C   s   t tdg d S r
  )rM   r   r   r\   r\   r]   test_rqX
  s    zTestOverwrite.test_rqc                 C   s   t tdg d S r
  )rM   r   r   r\   r\   r]   
test_schur[
  s    zTestOverwrite.test_schurc                 C   s    t dd dgtjtjgd d S )Nc                 S   s
   t | dS )Nr  )r   rx   r\   r\   r]   rg  _
  rh  z2TestOverwrite.test_schur_complex.<locals>.<lambda>r   )dtypes)rM   rT   r<   r  r   r\   r\   r]   test_schur_complex^
  s    
z TestOverwrite.test_schur_complexc                 C   s    t tdg t dd dg d S )Nr   c                 S   s   t | ddS )Nr  rB  )r   r  r\   r\   r]   rg  d
  rh  z(TestOverwrite.test_svd.<locals>.<lambda>)rM   r   r   r\   r\   r]   test_svdb
  s    zTestOverwrite.test_svdc                 C   s   t tdg d S r
  )rM   r   r   r\   r\   r]   test_svdvalsf
  s    zTestOverwrite.test_svdvalsN)r   r   r   r  r  r3  r  r  r2  r  r  r  r  r  r  r  r  r  r  r\   r\   r\   r]   r	  2
  s    r	  c                 C   s   t j| dftd|}t |j}d| }t|}t|j| df t	||
 |d t|j}t|jd t	||
 |d | dkr|st jd t j| dt jd|  }|dt j| d t jd|   }||}t|d	d
}t|j| df t|dd
}t|j| df d S )NrR   r   rv  rn   r   rR   rn   r|   -C6?MbP?Zrcondư>r}   )rT   r6   r	  rX   re   rx  r   r   rA   r   ZmeanrW   rL   rK   rU   )rY   rH   skip_bigr  rx  tolYr\   r\   r]   _check_orthj
  s$    
$
r%  r  z"test only on 64-bit, else too slowc               
   C   sJ   d} zt | tjdd W n, tk
rD } ztd|W 5 d }~X Y nX d S )Ni T)r"  z.memory error perhaps caused by orth regression)r%  rT   r  MemoryErrorrl  )rY   rA  r\   r\   r]   test_orth_memory_efficiency
  s    r'  c                  C   sF   t jt jt jt jg} dddddg}t| |D ]\}}t|| q.d S )Nrn   rR   r{   r   r   )rT   r<   r  r=   r  	itertoolsproductr%  )r  r  rn  rY   r\   r\   r]   	test_orth
  s    r*  c                  C   s  t jd t jt jt jt jg} dddddg}t| |D ]p\}}t j	d|f|d}t 
|j}d| }t|}t|j||d f t|| d|d	 t|j}t|jd
 t|j| d|d	 t jd|d  |}t|}t|j||d |d  f t|| d|d	 |dkr:t jd t j|dt jd| }|dt j|d t jd|  }||}t|dd}t|j||d f t|dd}t|j||d f q:d S )Nrn   rR   r{   r   r   r   rv  r   r  r  r|   r  r  r   r!  r}   )rT   rL   rK   r<   r  r=   r  r(  r)  r6   re   rx  r$   r   rA   r   rW   ZrandnrU   rX   )r  r  rn  rY   r  rx  r#  r$  r\   r\   r]   test_null_space
  s4    
$
r+  c               	   C   sb  t dt} | d d d df }| d d dd f }tt||tjd gd dd tt||tjd gd dd ||fD ]$}tt||t|jd dd qztddd	d
gddddgddddgddddgg}d}tt|d d d df |d d dd f d |dd tt|d d dd f |d d d df d |dd d}tt|d d d df |d d dgf |dd tt|d d dgf |d d d df |dd d}tt|d d d df |d d dgf |dd tt|d d dgf |d d d df |dd d}tt|d d d df |d d dd f |dgdd t	t
t|d | t	t
t||d  t	t
t|d d | tdddgdddgdddgdddgdddgg}tdddgdddgdddgdddgdddgg}ttjd ddg}tt|||dd d gdgg}d!dgddgg}tt||d"dd tt||d"dd d S )#Nr  r{   r`   r^  r  rn   g4?gVRf?g8!@g6?gN$ЗW?gJg~'@g3:]$gvMg ۿgPT#ge,?g΀?g+?gNG@gS<ʿg"	?rR   r   rq  rr  gL0?gĹ-?gyv?r   r   r  r  )r!   r	  r   r    rT   pir:   rA   r4   r   r   )Hr[   r   ri   r  rx   r   r\   r\   r]   test_subspace_angles
  sl    
  



0022220r.  c                   @   s|   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd ZdS )TestCDF2RDFc                 C   s   t d||S )Nz...ij,...jk->...ik)rT   Zeinsum)r   rx   r   r\   r\   r]   matmul
  s    zTestCDF2RDF.matmulc                 C   s   t | ||| || d S r   )r   r0  )r   r   ru   ri   r\   r\   r]   assert_eig_valid  s    

zTestCDF2RDF.assert_eig_validc                 C   s@   t d}t dt d }}t||\}}| ||| d S )Nr   r   )rT   r   r%   r1  r   r  r   ru   wrr   r\   r\   r]   test_single_array0x0real  s    
z$TestCDF2RDF.test_single_array0x0realc                 C   sF   t ddgddgg}t j|\}}t||\}}| ||| d S )Nrn   rR   r{   r   rT   r4   r8   r	   r%   r1  r2  r\   r\   r]   test_single_array2x2_real  s    z%TestCDF2RDF.test_single_array2x2_realc                 C   sF   t ddgddgg}t j|\}}t||\}}| ||| d S )Nrn   rR   r   r5  r2  r\   r\   r]   test_single_array2x2_complex  s    z(TestCDF2RDF.test_single_array2x2_complexc                 C   sR   t dddgdddgdddgg}t j|\}}t||\}}| ||| d S )Nrn   rR   r{   r|   r}   r5  r2  r\   r\   r]   test_single_array3x3_real  s    "z%TestCDF2RDF.test_single_array3x3_realc                 C   sR   t dddgdddgdddgg}t j|\}}t||\}}| ||| d S Nrn   rR   r{   r   rV  r|   r  r5  r2  r\   r\   r]   test_single_array3x3_complex!  s    "z(TestCDF2RDF.test_single_array3x3_complexc                 C   s\   t ddD ]L}tjd tjd||}tj|\}}t||\}}| ||| q
d S )Nrn   r_   iɚ;r   )	r   rT   rL   rK   rU   r8   r	   r%   r1  r   r   r  r   ru   r3  r   r\   r\   r]   test_random_1d_stacked_arrays'  s    z)TestCDF2RDF.test_random_1d_stacked_arraysc                 C   sR   t ddD ]B}tjdd||}tj|\}}t||\}}| ||| q
d S )Nrn   r_   r   )r   rT   rL   rU   r8   r	   r%   r1  r;  r\   r\   r]   test_random_2d_stacked_arrays0  s
    z)TestCDF2RDF.test_random_2d_stacked_arraysc                 C   s(   t dt d }}ttt|| d S )Nr\   )rR   )rT   r   r4   r   r   r%   r   r   ru   r\   r\   r]   test_low_dimensionality_error8  s    z)TestCDF2RDF.test_low_dimensionality_errorc                 C   s0   t dt ddd }}ttt|| d S )Nr{   r}   rR   rT   r;   r   r   r   r%   r>  r\   r\   r]   r   <  s    z!TestCDF2RDF.test_not_square_errorc                 C   sD   t dddgdddgdddgg}t j|\}}ttt|| d S r9  rT   r4   r8   r	   r   r   r%   r   r  r   ru   r\   r\   r]   test_swapped_v_w_errorA  s    "z"TestCDF2RDF.test_swapped_v_w_errorc                 C   s0   t dt ddd }}ttt|| d S )Nr{   r   rV  r@  r>  r\   r\   r]   test_non_associated_errorG  s    z%TestCDF2RDF.test_non_associated_errorc                 C   s   t dddgdddgdddgg}t j|\}}ttt|| t dddgdddgdddggdddgdddgdddggg}t j|\}}ttt|| d S )Nrn   rR   r{   r|   r   y      @      rA  rB  r\   r\   r]   test_not_conjugate_pairsL  s    "z$TestCDF2RDF.test_not_conjugate_pairsN)r   r   r   r0  r1  r4  r6  r7  r8  r:  r<  r=  r?  r   rC  rD  rE  r\   r\   r\   r]   r/  
  s   	r/  )r_   )F)r  Z	__usage__r(  r  r  ZnumpyrT   Znumpy.testingr   r   r   r   r   r   r   r   r   Zscipy.linalgr	   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&   Zscipy.linalg.lapackr'   r(   r)   r*   r+   r,   r-   r.   r/   r0   Zscipy.linalg._miscr1   Zscipy.linalg._decomp_qzr2   Zscipy.statsr3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   Znumpy.randomrK   rL   Zscipy.linalg._testutilsrM   Zscipy.sparse._sputilsrN   Zscipy._lib._testutilsrO   Zscipy.linalg.blasrP   r	  r^   r  ZREAL_DTYPESr  rS   rk  rb   rm   rw   ry   rz   r   r   r?  rR  r  r  r  r  r  r  r  r  rR  r[  rv  r  r  r  r  r  r  r   r  machiner  r  r  r   r  r	  r%  r  Zintpr  r'  r*  r+  r.  r/  r\   r\   r\   r]   <module>   s    0d
 [  o ] 9    "h7K 3 K#

 8
&: