o
    i#4                    @   s  d dl Z d dlZd dlmZmZmZmZmZmZm	Z	m
Z
 d dlmZ d dlmZmZmZmZmZmZ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) d dl*m+Z+ d dl,m-Z-m.Z. d d	l/m0Z0 ej
ej1ej2fZ3ej4ej5ej6fZ7e3e7 Z8d
d Z9G dd dZ:G dd dZ;G dd dZ<G dd dZ=G dd dZ>G dd dZ?d/ddZ@G dd dZAG dd dZBG dd dZCejDEd d!ejDEd"eefd#d$ ZFG d%d& d&ZGG d'd( d(ZHG d)d* d*ZIG d+d, d,ZJG d-d. d.ZKdS )0    N)arangearraydotzerosidentity	conjugate	transposefloat32)random)assert_equalassert_almost_equalassert_assert_array_almost_equalassert_allcloseassert_array_equalsuppress_warnings)raises)solveinvdetlstsqpinvpinvhnormsolve_bandedsolveh_bandedsolve_triangularsolve_circulant	circulantLinAlgError
block_diagmatrix_balanceqrLinAlgWarningassert_no_overwrite)check_free_memoryIS_MUSL)	HAS_ILP64c                 C   s2   | }|t jkrt j}n|t jkrt j}t |jS )z;Get the epsilon for dtype, possibly downcast to BLAS types.)np
longdoublefloat64clongdouble
complex128finfoeps)Zdtypdt r1   W/home/kim/smarthome/.venv/lib/python3.10/site-packages/scipy/linalg/tests/test_basic.py	_eps_cast   s   

r3   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ejdeeejeejgejdeeejeejgdd ZdS )TestSolveBandedc                 C      t g dg dg dg dg}t g dg dg dg dg}d	\}}t g d
}|dd}t ddgddgddgddgg}t g dg dg dg dg}||||fD ]}	t||f||	}
tt||
|	 qVd S )N      ?   r   r         r         r8   r>   r                 r8   r<   r>   r?   r;   r8   rC   r:   r?   rB   r   r>   rA   r   r   r>   r?         $@rE          @g      ,@rA   r?   r>   r:   r;      r?   r   r   r   r   r   r   r?   r   r?   r   r   r   reshaper   r   r   selfaablub4b4by1b4by2b4by4bxr1   r1   r2   	test_real(   6   zTestSolveBanded.test_realc                 C   r5   )Nr6   r9   )               @r?   r8   ra   r@   rE   r8   r<   ra   rF   rG   )ra   rA   r   r   rI   rK   rE   rL   y              ,@rA   r?   r>   r:   r;   rM   rN   )r   r   r                 ?rP   rQ   rS   r1   r1   r2   test_complex@   r`   zTestSolveBanded.test_complexc           	      C      t g dg dg dg}t|ddd f dt|dd d f d t|dd df d }t g d}|dd}t ddgd	d
gddgddgg}t g dg dg dg dg}||||fD ]}td||}tt||| qcd S )NrD   rF   rG   r   r?   r>   rA   rJ   r:   r;   rM   rN   rO   rP   r?   r?   r   r)   diagrR   r   r   r   	rT   rV   rU   rY   rZ   r[   r\   r]   r^   r1   r1   r2   test_tridiag_realX   .   2z!TestSolveBanded.test_tridiag_realc           	      C   rf   )Nrb   rF   rG   r   r?   r>   rA   rc   r:   r;   rM   rN   rO   rP   rg   rh   rj   r1   r1   r2   test_tridiag_complexl   rl   z$TestSolveBanded.test_tridiag_complexc                 C   s|   t g dg dg dg dg}t g dg dg dg dg}d	\}}t g d
}t||f||dd}tt||| d S )Nr6   r9   r=   r@   rD   rF   rG   rH   rI   rJ   Fcheck_finite)r   r   r   r   )rT   rU   rV   rW   rX   rY   r^   r1   r1   r2   test_check_finite   s   z!TestSolveBanded.test_check_finitec                 C   s   t g dg dg dg dg}d\}}t g ddd}ttt||f|| ttt||f|d	d
g tttd|d	d
g d S )NrD   rF   rG   rH   rI   )r7   rL         @      @rA   r;   r7   rL   rg   )r   rR   assert_raises
ValueErrorr   )rT   rV   rW   rX   badr1   r1   r2   test_bad_shape   s   zTestSolveBanded.test_bad_shapec                 C   s   t g dg}t g dg}tddgg|}t||dd tddgdgdgg|}t||dd t|jtd	 t|g dg d S )
Nr7   rL   rq   )      ?r7   g      ?r   r   r>   V瞯<rtolrg   r   f8)r   r   r   r   dtyper)   r   )rT   r]   refr^   r1   r1   r2   test_1x1   s   zTestSolveBanded.test_1x1c                 C   sl   g dg dg dg dg}g dg dg dg dg}d	\}}g d
}t ||f||}tt||| d S )Nr6   r9   r=   r@   rD   rF   rG   rH   rI   rJ   )r   r   r   )rT   rU   rV   rW   rX   r]   r^   r1   r1   r2   test_native_list_arguments   s   z*TestSolveBanded.test_native_list_argumentsdt_abdt_bc                 C   s   t jg g|d}t jg |d}td||}|jdksJ |jtt jd|dt jd|djks1J t jd|d}td||}|jdksEJ |jtt jd|dt jd|djksZJ d S )Nr~   ry   r   r?   )	r)   r   r   shaper~   r   eyeonesemptyrT   r   r   rV   r]   r^   r1   r1   r2   
test_empty   s   *.zTestSolveBanded.test_emptyN)__name__
__module____qualname__r_   re   rk   rm   rp   rv   r   r   pytestmarkthread_unsafeparametrizeintfloatr)   r	   complex	complex64r   r1   r1   r1   r2   r4   &   s    r4   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ejd-eeeje ej!gejd.eeeje ej!gd/d0 Z"d1S )2TestSolveHBandedc                 C   B   t g dg dg dg}t g d}t||}t|g d d S NrE   rE   rL   rL   r7   r7   r7   rr   rr   rr   rr   r7   rr   r7   rL   rE   r7   rE   rE   r   r   r   rT   rV   r]   r^   r1   r1   r2   test_01_upper      
zTestSolveHBanded.test_01_upperc                 C   sr   t g dg dg dg}t ddgddgddgddgg}t||}t ddgddgddgddgg}t|| d S )	Nr   r   r   r7         @rr   rL   rE   r   rT   rV   r]   r^   expectedr1   r1   r2   test_02_upper       
zTestSolveHBanded.test_02_upperc                 C   sV   t g dg dg dg}t g ddd}t||}t|t g ddd d S )Nr   r   r   r   rA   r?   r   r   rR   r   r   r   r1   r1   r2   test_03_upper   s   
zTestSolveHBanded.test_03_upperc                 C   sF   t g dg dg dg}t g d}t||dd}t|g d d S )Nr   r7   r7   r7   r   rL   rL   rE   rE   r   Tlowerr   r   r   r1   r1   r2   test_01_lower   s   zTestSolveHBanded.test_01_lowerc                 C   sv   t g dg dg dg}t ddgddgddgddgg}t||dd	}t d
dgdd
gd
dgd
d
gg}t|| d S )Nr   r   r   r7   r   rr   rL   Tr   rE   r   r   r1   r1   r2   test_02_lower  s    zTestSolveHBanded.test_02_lowerc                 C   sJ   t g dg dg dgtd}t g dtd}t||}t|g d d S )Nr   r   r   r   r   r   r   r	   r   r   r   r1   r1   r2   test_01_float32#  s   
z TestSolveHBanded.test_01_float32c                 C   sz   t g dg dg dgtd}t ddgddgddgddggtd}t||}t d	dgdd	gd	dgd	d	gg}t|| d S )
Nr   r   r   r   r7   r   rr   rL   rE   r   r   r1   r1   r2   test_02_float321  s(   
z TestSolveHBanded.test_02_float32c                 C   r   )Nr   r                r   r   r   )       @            @            @      ?       @      ?)rE   r7   r7   rE   r   r   r1   r1   r2   test_01_complexF  r   z TestSolveHBanded.test_01_complexc                 C   sr   t g dg dg dg}t ddgddgdd	gd
dgg}t||}t ddgddgddgddgg}t|| d S )Nr   r   r   r          @      @r               r   y      @       @r   rd   rE   r7   r   r   r1   r1   r2   test_02_complexT  r   z TestSolveHBanded.test_02_complexc                 C   <   t g dg dg}t g d}t||}t|g d d S )Nr   r7   r7   rr   rr   rr   r7   rr   r7   rE   r7   rE   r   r   r1   r1   r2   test_tridiag_01_upperi     
z&TestSolveHBanded.test_tridiag_01_upperc                 C   s`   t g dg dg}t ddgddgddgg}t||}t ddgddgddgg}t|| d S )Nr   r   r7   rr   rL   rE   r   r   r1   r1   r2   test_tridiag_02_uppert     
z&TestSolveHBanded.test_tridiag_02_upperc                 C   sP   t g dg dg}t g ddd}t||}t|t g ddd d S )Nr   r   r   rA   r?   r   r   r   r1   r1   r2   test_tridiag_03_upper  s   
z&TestSolveHBanded.test_tridiag_03_upperc                 C   @   t g dg dg}t g d}t||dd}t|g d d S )Nr   r7   r7   r   r   Tr   r   r   r   r1   r1   r2   test_tridiag_01_lower  s   z&TestSolveHBanded.test_tridiag_01_lowerc                 C   sd   t g dg dg}t ddgddgddgg}t||dd}t ddgddgddgg}t|| d S )	Nr   r   r7   rr   rL   Tr   rE   r   r   r1   r1   r2   test_tridiag_02_lower  s   z&TestSolveHBanded.test_tridiag_02_lowerc                 C   sD   t g dg dgtd}t g dtd}t||}t|g d d S )Nr   r   r   r   r   r   r   r1   r1   r2   test_tridiag_01_float32  s   
z(TestSolveHBanded.test_tridiag_01_float32c                 C   sh   t g dg dgtd}t ddgddgddggtd}t||}t ddgddgddgg}t|| d S )Nr   r   r   r7   rr   rL   rE   r   r   r1   r1   r2   test_tridiag_02_float32  s"   
z(TestSolveHBanded.test_tridiag_02_float32c                 C   r   )Nr   r   r   r   )r   r   r   )rE   r7   r7   r   r   r1   r1   r2   test_tridiag_01_complex  r   z(TestSolveHBanded.test_tridiag_01_complexc                 C   s`   t g dg dg}t ddgddgddgg}t||}t d	d
gdd	gddgg}t|| d S )Nr   r   r                 @r   r   r   rr   rE   rd   r7   r   r   r1   r1   r2   test_tridiag_02_complex  r   z(TestSolveHBanded.test_tridiag_02_complexc                 C   r   )Nr   r   r   Frn   r   r   r   r1   r1   r2   rp     s   z"TestSolveHBanded.test_check_finitec                 C   s\   t g dg dg}t ddgddgg}ttt|| ttt|ddg ttt|dg d S )Nr   r   r7   rr   rL   )r   rs   rt   r   )rT   rV   r]   r1   r1   r2   test_bad_shapes  s   z TestSolveHBanded.test_bad_shapesc                 C   s:   t dggg dg}t|g dg t|jtd d S )Nr?   r?   r>   rM   rw   r}   )r   r   r   r~   r)   )rT   r^   r1   r1   r2   r     s   zTestSolveHBanded.test_1x1c                 C   s:   g dg dg dg}g d}t ||}t|g d d S r   )r   r   r   r1   r1   r2   r     s   
z+TestSolveHBanded.test_native_list_argumentsr   r   c                 C   s   t jg g|d}t jg |d}t||}|jdksJ |jtt jd|dt jd|djks0J t jd|d}t||}|jdksCJ |jtt jd|dt jd|djksXJ d S )Nr   r   r?   ry   )	r)   r   r   r   r~   r   r   r   r   r   r1   r1   r2   r     s   
*
.zTestSolveHBanded.test_emptyN)#r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rp   r   r   r   r   r   r   r   r   r)   r	   r   r   r   r1   r1   r1   r2   r      s4    		r   c                
   @   s  e Zd Zdd Zejj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ejjejd/d0d1d2 Zd3d4 Zd5d6 Z d7d8 Z!d9d: Z"d;d< Z#d=d> Z$ejj%d?d@dAdB Z&ejjejdCe'e(e)j*e+e)j,gejdDe'e(e)j*e+e)j,gdEdF Z-dGdH Z.ejdIe)j/e)j0gejdJg dKejdLdMdNgejdOdPdQgejdRdPdQgejdSdPdQgdTdU Z1dVS )W	TestSolvec                 C      t jd d S N  r)   r
   seedrT   r1   r1   r2   setup_method     zTestSolve.setup_methodc                 C   sl   ddgddgg}t |ddg}tt||ddg ddgddgg}ddg}t ||}tt||ddg d S )Nr?   r7   r                   333333?r   r   r   )rT   rU   Zx0r]   r1   r1   r2   test_20Feb04_bug  s   
zTestSolve.test_20Feb04_bugc                 C   sZ   ddgddgg}ddgddggddgddgddggfD ]}t ||}tt||| qd S )Nr?   r8   r:   r;   r   r>   r   rT   rU   r]   r^   r1   r1   r2   test_simple)  s   
zTestSolve.test_simplec                 C   sd   t ddgddggd}ddgddgddggdd	gt ddgdfD ]}t||}tt||| q d S )
N   r>   ra   r;   Drd   r   r?   r   )r   r   r   r   r   r1   r1   r2   test_simple_complex2  s   
zTestSolve.test_simple_complexc                 C   \   ddgddgg}dD ]!}ddgddggddgfD ]}t ||d|d}tt||| qq
d S )	Nr>   rM   r   r   r?   r?   r   posassume_ar   r   rT   rU   r   r]   r^   r1   r1   r2   test_simple_pos<     zTestSolve.test_simple_posc                 C   P   ddgddgg}ddgddgddggfD ]}t ||dd}tt||| qd S )Nr   r>   r;   rd   r   r   r   r   r   r1   r1   r2   test_simple_pos_complexbE     z"TestSolve.test_simple_pos_complexbc                 C   r   )	Nr>   rM   r   r?   r   symr   r   r   r1   r1   r2   test_simple_symM  r   zTestSolve.test_simple_symc                 C   r   )Nr   r>   rd   r   r   r   r   r   r1   r1   r2   test_simple_sym_complexbV  r   z"TestSolve.test_simple_sym_complexbc                 C   sV   ddgddgg}ddgddgddgddggfD ]}t ||dd	}tt||| qd S )
Nr   r   r   rd   r   r?   r>   r   r   r   r   r1   r1   r2   test_simple_sym_complex^     z!TestSolve.test_simple_sym_complexc                 C   sb   ddgddgg}dD ]$}ddgddggddgddgfD ]}t ||d|d	}tt||| qq
d S )
Nr>   rM   r   r   r?   r   rd   herr   r   r   r1   r1   r2   test_simple_her_actuallysymg  s   z%TestSolve.test_simple_her_actuallysymc                 C   sV   ddgddgg}ddgddgddgddggfD ]}t ||d	d
}tt||| qd S )Nr   r   r   r   rd   r   r?   r>   r   r   r   r   r1   r1   r2   test_simple_herq  r   zTestSolve.test_simple_herc                 C   s   d}t ||gt ||gd  }t||fd}t|}t|t|d  }td|D ]}|d d |f }t|||d d |f< q*t|| d S )Nr>   rd   r   r   r   )r
   r   r   r   r   r   r   )rT   nAXZAinvRirr1   r1   r2   test_nils_20Feb04z  s   zTestSolve.test_nils_20Feb04c                 C   sr   d}t ||g}t|D ]}dd|||f   |||f< qtdD ]}t |dg}t||}tt||| q!d S )Nr8   皙?r;   rM   r
   ranger   r   r   rT   r   rU   r   r]   r^   r1   r1   r2   test_random  s   
zTestSolve.test_randomc                 C   s   d}t ||gdt ||g  }t|D ]}dd|||f   |||f< qtdD ]}t |dg}t||}tt||| q)d S )Nr8   rd   r  r>   rM   r  r  r1   r1   r2   test_random_complex  s   
zTestSolve.test_random_complexc                 C   s   d}t ||g}t|D ]#}tdd|||f   |||f< t|D ]}|||f |||f< q"qtdD ]}t |g}t||dd}tt||| q4d S )Nr8   r  r;   r   r   )r
   r  absr   r   r   rT   r   rU   r   jr]   r^   r1   r1   r2   test_random_sym  s    
zTestSolve.test_random_symc                 C   s   d}t ||g}|dt ||g  }t|D ]%}tdd|||f   |||f< t|D ]}t|||f |||f< q,qt |gdt |g  }tdD ]}t||dd}tt||| qLd S )Nr8   rd   r  ra   r>   r   r   )r
   r  r	  r   r   r   r   r
  r1   r1   r2   test_random_sym_complex  s    z!TestSolve.test_random_sym_complexc                 C   s^   ddgddgg}ddgddggddgddgddggfD ]}t ||dd}tt||| qd S )	Nr?   r8   r:   r;   r   r>   Frn   r   r   r1   r1   r2   rp     s   zTestSolve.test_check_finitec                 C   s8   d}g d}t ||}t| | t|jdkd d S )Nr?   r   rM   z'Scalar_a_1D_b test returned wrong shape)r   r   ravelr   r   r   r1   r1   r2   test_scalar_a_and_1D_b  s
   
z TestSolve.test_scalar_a_and_1D_bc                 C   sp   t g dg dg dg dg}t ddgddgd	d
gddgg}t||}t|t g dg dgj d S )N)?g
ףp=
@gffffff @g{Gz)g     h@g     prg     Wg     w)gHzG?gQg333333gp=
ף)g(\gQgzGg?g
ףp=
#@gQx2@g     @g      l@gp=
ף?g(\*gzGgףp=
)r7   rA   rM   r   )rM   r>   r;   r?   )r)   r   r   r   Tr   r1   r1   r2   test_simple2  s    


zTestSolve.test_simple2c              	   C   sz   t g dg dg dg dg}t ddgddgd	d
gddgg}t||}t|t ddgddgddgddgg d S )N)yq=
ףpffffff@yQ?\(\	@y(\y
ףp=
?q=
ףp)y333333333333,y̌@@      y      *@y)@+@)yRQ
Qy(\Gz@yQyQ??)yHzG@(\?yQ῅Q?y(\Gzy\(\q=
ףp?y(\B:@p=
I@yRQ?@y33333P@33333Uy33333c@ffffff,y      (\O9@y333333q=
ף0>@y(\?(\@y{Gz333333@      ?      ?y             y       @      y      @      ?y            y            @y              @)r)   r   r   r   r   r1   r1   r2   test_simple_complex2  s    


zTestSolve.test_simple_complex2c                 C   s   t g dg dg dg dg}t ddgddgd	d
gddgg}t ddgddgddgddgg}t||dd}t|| t| j|ddd}t|| d S )N)gq=
ףpy)\(?)\(y{GzzGyHzG@      )r   gQyq=
ףpQ?yGz@zG?)r   r   g=
ףp!yHzG?)r   r   r   g(\yףp=
@\(\$yGz<@RCy)\(#
ףp=
@y
ףp=8 yp=
ף0yQ@zGQy)\(@Q@yRA(\2@r   y             @y      @       y      @       y             @y            @      ?      y      @      r   r   Tr   )r)   r   r   r   conjr  )rT   rU   r]   resr^   r1   r1   r2   test_hermitian  s&   



zTestSolve.test_hermitianc                 C   sp   t dddd}tt |d t ddd}t|g d tt |d t ddd}t|g d d S )	Nr?   
   rM   	   r   r   )      "@r  r7   r   r)   r   rR   r   trilr   r   rT   r   r^   r1   r1   r2   test_pos_and_sym  s
   zTestSolve.test_pos_and_symc                 C   sh   t g dg dg dg dg dg dg dg dg dg	}t dd d d f }ttt|| d S )N)	r?   r   r   r   r   r   r?   r   r?   )	r?   r?   r?   r   r   r   r?   r   r?   )	r   r?   r?   r   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   rs   r   r   rT   rU   r]   r1   r1   r2   test_singularity  s   
	zTestSolve.test_singularity	structure)	diagonaltridiagonallower triangularupper triangular	symmetric	hermitianpositive definitegeneralNc                 C   sz   t jd}d}t dd|}t |}|j|d}d}tjt|d t|||d W d    d S 1 s6w   Y  d S )	Nl   Ej] r  r   2   sizezIll-conditioned matrix...matchr   )	r)   r
   default_rngZlogspaceri   r   Zwarnsr#   r   )rT   r#  rngr   dr   r]   messager1   r1   r2   test_ill_condition_warning	  s   
"z$TestSolve.test_ill_condition_warningc                 C   s2   t d}t jddd}t||}t|| d S )Nr>   rM   r;   )r)   r   r
   randr   r   r   r1   r1   r2   test_multiple_rhs  s   

zTestSolve.test_multiple_rhsc                 C   sr   t dddd }tt |d t ddd}t|g d tt |d t ddd}t|g d d S )	Nr  rM   r?   T
transposed)r   g?r?   F)r  gg333333r  r  r1   r1   r2   test_transposed_keyword  s
   z!TestSolve.test_transposed_keywordc                 C   sL   t dt}tt t||dd W d    d S 1 sw   Y  d S )NrM   Tr8  )r)   r   astyper   rs   NotImplementedErrorr   rT   rU   r1   r1   r2   test_transposed_notimplemented%  s   
"z(TestSolve.test_transposed_notimplementedc                 C   s   t ttddgd d S )Nr?   r>   rs   rt   r   r   r1   r1   r2   test_nonsquare_a*     zTestSolve.test_nonsquare_ac                 C   s@   t ttdtdtd ttttdtd d S )NrM   r;   )r   r   r)   r   r   rs   rt   r   r1   r1   r2   test_size_mismatch_with_1D_b-  s   "z&TestSolve.test_size_mismatch_with_1D_bc                 C   s   t ttdddd d S )Nr?   Zzxcvr   r?  r   r1   r1   r2   test_assume_a_keyword1  rA  zTestSolve.test_assume_a_keywordz5Failure on OS X (gh-7500), crash on Windows (gh-8064)reasonc                 C   s  ddg}g d}t jt jt jt jg}t|||D ]\}}}|t jt jfv }|dkr-|s-qd| d| d| }t j||	|}	t j|	|}
|r[|	dt j|| 	| }	|d	kre|	|	j
 }	n|dkrq|	|	j
  }	n|d
kr|	 j
|	dt |  }	|t jt jfv rdnd}|dv r|t jt jfv r|d9 }t|	|
|d}t|	||
|| || |d |d	kr|t jt jfvrt|	|
|dd}t|	||
|| || |d qd S )Nr  d   )genr   r   r   r   zFailed for size: z, assume_a: z,dtype: rd   r   r   r  -q=gư>)rG  r   r   r   atolr|   err_msgT)r   r9  )r)   r	   r+   r   r-   	itertoolsproductr
   randnr;  r  r  r   r   r   r   )rT   sizesZ	assume_asZdtypesr.  r   r~   Z
is_complexrK  rU   r]   tolr^   r1   r1   r2   'test_all_type_size_routine_combinations4  sV   z1TestSolve.test_all_type_size_routine_combinationsdt_ar   c                 C   f   t jd|d}t jd|d}t||}|jdksJ tt jd|dt jd|dj}|j|ks1J d S Nry   r   r   r>   )r)   r   r   r.  r   r   r~   rT   rR  r   rU   r]   r^   dt_nonemptyr1   r1   r2   r   e  s   
 zTestSolve.test_emptyc                 C   @   t d}g g g}t||}t|jdkd t|jdkd d S Nr>   r   zReturned array is not empty)r>   r   z#Returned empty array shape is wrong)r)   r   r   r   r.  r   r   r1   r1   r2   test_empty_rhsq  
   

zTestSolve.test_empty_rhsr~   r   )r$  r%  bandedr&  r'  r(  r)  r+  r   r   rG  nrhsr1   )r   r9  TF	overwritefortranc                 C   sj  t jd}|dksdnd}|j|f| d}	|j||fd}
t |t jr?|	|j|f| dd  }	|
|j||fdd  }
|dkrLt t |
}
nn|dkrVt |
}
nd|d	kr`t |
}
nZ|d
krt t |
t t |
dd t t |
dd }
n9|dkrt t |
dd}
n*|dv r|
|
j }
n |dv r|
|
	 j }
n|dv r|
|
j }
|
t |
j
dd7 }
|rt |
}
|
jdd}|	 }t |t jr|rd}tjt|d t|
|	|||d W d    d S 1 sw   Y  d S t|
|	||||d}t j|r|jn||}t|| |dkr$tt|||d| |s3t|
| t|	| d S d S )Nl   q~u r[  r   r8   r-  rd   r$  r&  r'  r%  rA   r?   r>   >   r(  r   >   r)  r   >   r   r*  axisr   )orderz#scipy.linalg.solve can currently...r/  )overwrite_aoverwrite_br9  )rb  rc  r9  r   r8  )r)   r
   r1  
issubdtypecomplexfloatingri   r  Ztriur  r  sumZasfortranarraycopyr   r   r<  r   linalgr   r   )rT   r~   r   r\  r9  r]  r^  r2  r   r]   r   ZA_copyZb_copyr4  r  r   r1   r1   r2   test_structure_detectionx  sj   







z"TestSolve.test_structure_detectionN)2r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  rp   r  r  r  r  r   r"  r   r5  r7  r:  r>  r@  rB  rC  skiprQ  r   r   r)   r	   r   r   r   rY  r+   r-   ri  r1   r1   r1   r2   r     sd    
	
			
	


/	r   c                	   @   sl   e Zd Zdd Zdd Zdd Zejde	e
ejeejgejde	e
ejeejgd	d
 Zdd ZdS )TestSolveTriangularc                 C   s   t ddgddgg}ddg}t||dd}t|ddg t|j|dd}t|ddg t||ddd}t|ddg td}t||ddd}t|d	d
gddgg dS ):
        solve_triangular on a simple 2x2 matrix.
        r?   r   r>   Tr   Frx   r   Ztransr7         N)r   r   r   r  r   rT   r   r]   Zsolr1   r1   r2   r     s   zTestSolveTriangular.test_simplec                 C   s>  t ddgddgg}td}t||ddd}t|dd	gdd
gg tddg}t||ddd}t|ddgddgg t||ddd}t|ddgddgg t||ddd}t|ddgddgg t|j|ddd}t|ddgddgg t|j|ddd}t|ddgddgg t|j|ddd}t|ddgddgg dS )zA
        solve_triangular on a simple 2x2 complex matrix
        r  r   rd   r>   Tr?   rm  y      ?      y      п      пrx         ?       @y             y      ?      ?y      ?      y            пFrn  N)r   r   r   r   r)   ri   r  ro  r1   r1   r2   r     s"   z'TestSolveTriangular.test_simple_complexc                 C   s>   t ddgddgg}ddg}t||ddd}t|ddg dS )rl  r?   r   r>   TF)r   ro   N)r   r   r   ro  r1   r1   r2   rp     s   z%TestSolveTriangular.test_check_finiterR  r   c                 C   rS  rT  )r)   r   r   r.  r   r   r~   rU  r1   r1   r2   r     s   
zTestSolveTriangular.test_emptyc                 C   rW  rX  )r)   r   r   r   r.  r   r   r1   r1   r2   rY  
  rZ  z"TestSolveTriangular.test_empty_rhsN)r   r   r   r   r   rp   r   r   r   r   r   r)   r	   r   r   r   rY  r1   r1   r1   r2   rk    s    	rk  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ejeejgdd ZdS )TestInvc                 C   r   r   r   r   r1   r1   r2   r     r   zTestInv.setup_methodc                 C   sf   ddgddgg}t |}tt||td g dg dg dg}t |}tt||td d S )Nr?   r>   rM   r;   r   r;   r   r<   rB      r  )r   r   r   r)   r   rT   rU   a_invr1   r1   r2   r     s   zTestInv.test_simplec                 C   sh   d}t dD ]+}t||g}t |D ]}dd|||f   |||f< qt|}tt||t| qd S )Nr8   r;   r  r  r
   r   r   r   r   rT   r   r   rU   rv  r1   r1   r2   r    s   
zTestInv.test_randomc                 C   s8   ddgddgg}t |}tt||ddgddgg d S )Nr?   r>   rM   r   r   r   r   r   ru  r1   r1   r2   r   (  s    zTestInv.test_simple_complexc                 C   sx   d}t dD ]3}t||gdt||g  }t |D ]}dd|||f   |||f< qt|}tt||t| qd S )Nr8   r;   ra   r  rw  rx  r1   r1   r2   r  -  s   
zTestInv.test_random_complexc                 C   s<   ddgddgg}t |dd}tt||ddgddgg d S )Nr?   r>   rM   r;   Frn   r   ry  ru  r1   r1   r2   rp   7  s    zTestInv.test_check_finiter0   c                 C   F   t jd|d}t|}|jdksJ |jtt jd|djks!J d S rT  )r)   r   r   r.  r~   r   )rT   r0   rU   rv  r1   r1   r2   r   <     "zTestInv.test_emptyN)r   r   r   r   r   r  r   r  rp   r   r   r   r   r   r)   r	   r   r   r   r1   r1   r1   r2   rq    s    

rq  c                   @   s   e Zd Zdd Zdd Zdd Zejdddgd	d	gg d
gdd Z	dd Z
ejddd ejd dd	 D dd Zdd Zdd Zejdeeejeejgdd Zdd Zdd  Zd!d" ZdS )#TestDetc                 C   s   t jd| _d S )Nl   *n`/ )r)   r
   r1  r2  r   r1   r1   r2   r   E     zTestDet.setup_methodc                 C   s   t dgg}t|}|jjdksJ t |sJ |dks J t jdggggdd}t|}|jjdks7J |jdks>J t|dgg t jdgggt jd}t|}|jjdks\J |jd	kscJ t|dg d S )
Nr?   r3  r7   fr   rg   y      ?      @r   )r?   )	r)   r   r   r~   charZisscalarr   r   r   rT   rU   detar1   r1   r2   test_1x1_all_singleton_dimsH  s   z#TestDet.test_1x1_all_singleton_dimsc                 C   s   | j jg dtjd}t|}|jjdksJ |jdksJ t|t	| | j jg dtjdt
d }t|}|jjdksBJ |jdksIJ t|t	| d S )N)r;   r   r?   r?   r   r3  r;   r   rd   r   )r2  r
   r)   r	   r   r~   r  r   r   Zsqueezer   r  r1   r1   r2   test_1by1_stacked_input_outputY  s    z&TestDet.test_1by1_stacked_input_outputr   r>   r8   )rM   r>   r8   r8   c                 C   s   | j jdd|d}t|tj|}}t|| | j jdd|dd }|| j jdd|d7 }t|tj|}}t|| d S )N      r7   r-  rd   rn  rx   )r2  uniformr   r)   rh  r   )rT   r   rU   Zd1Zd2r]   Zd3Zd4r1   r1   r2   #test_simple_det_shapes_real_complexf  s   
z+TestDet.test_simple_det_shapes_real_complexc                 C   s   t g dg dg dg dg dg dg dg dg}tt|d	 ttt d
ddd t jg dg dg dg dgt jd}tt|d t g dg dg dg dg dg dg dg dgd }tt|d d S )N)r?   r?   r?   r?   r?   r?   r?   r?   )r?   rA   r?   rA   r?   rA   r?   rA   )r?   r?   rA   rA   r?   r?   rA   rA   )r?   rA   rA   r?   r?   rA   rA   r?   )r?   r?   r?   r?   rA   rA   rA   rA   )r?   rA   r?   rA   rA   r?   rA   r?   )r?   r?   rA   rA   rA   rA   r?   r?   )r?   rA   rA   r?   rA   r?   r?   rA   g      @   r   rE   )r   r                 r  )r   r         ?        r  )rd   r  r   r   )r  rd   r   r   r   y      @        )g             r7   rE   rE   rE   rE   rE   )r7   rE   rE   rE   rE   rE   rE   rE   )rE   g      rE   g      r7   rE   rE   rE   )rE   r7   rE   rE   rE   rE   rE   rE   )rE   rE   rE   g      rE   g      r7   rE   )rE   rE   rE   r7   rE   rE   rE   rE   )rE   rE   rE   rE   rE   g       rE   g      ")rE   rE   rE   rE   rE   r7   rE   rE   rd   r  )r)   r   r   r   r   rR   r   r=  r1   r1   r2   test_for_known_det_valuesq  s>   


z!TestDet.test_for_known_det_valuestypc                 C   s   g | ]}|d vr|qS )ZgGr1   ).0r^   r1   r1   r2   
<listcomp>  s    zTestDet.<listcomp>ZAllNc                 C   s8   d}| j ||g|}tt|tjtjB sJ d S )Nr;   )r2  r
   r;  
isinstancer   r)   r+   r-   )rT   r  r   rU   r1   r1   r2   "test_sample_compatible_dtype_input  s   z*TestDet.test_sample_compatible_dtype_inputc              	   C   sB  d}t dg dD ](\}}tt|d ttjddggd |d W d    n1 s,w   Y  q	tt|d ttjd	d
ggd dd W d    n1 sQw   Y  tt|d ttjddggd dd W d    n1 suw   Y  tt|d ttjddggd dd W d    d S 1 sw   Y  d S )Nz!cannot be cast to float\(32, 64\)ZSUO)Zbytes8Zstr32objectr/  rU   r]   r>   r      a   bVrF     zdatetime64[s]ztimedelta64[s])ziprs   	TypeErrorr   r)   r   )rT   msgctr1   r1   r2   test_incompatible_dtype_input  s   "z%TestDet.test_incompatible_dtype_inputc                 C   sP  t ttddgd t ttg dtg  t ttg dtg d ttdd ttg d W d    n1 sFw   Y  ttd	d ttg  W d    n1 scw   Y  ttdd ttg g W d    n1 sw   Y  ttdd ttg gg W d    d S 1 sw   Y  d S )
Nr   r7   )r   r   r   rM   r   r   r7   r7   r7   zLast 2 dimensionsr/  )r   r   rM   zat least two-dimensional)r   r   r)   r   r   rs   rt   r   r1   r1   r2   test_empty_edge_cases  s   ""zTestDet.test_empty_edge_casesr0   c                 C   s   t jd|d}t|}|jdksJ |jtt jd|djks!J t jd|d}t|}|jdks3J |jtt jd|djksBJ d S )Nry   r   r1   r>   r  r  )rM   r?   r?   )r)   r   r   r   r~   r   r   )rT   r0   rU   r3  r1   r1   r2   test_empty_dtype  s   "zTestDet.test_empty_dtypec                 C   sL   t dddt j}| }t|dd}t|d ||k r$J d S )Nr  rM   Trb  rE   )	r)   r   rR   r;  r	   rg  r   r   all)rT   rU   acr  r1   r1   r2   test_overwrite_a  s
   
zTestDet.test_overwrite_ac                 C   s>   t g dg dg dg}|jdd tt|ddd d S )	N)rL   rE   r7   )      @rq   r  r  F)writeTr  rK   )r)   r   Zsetflagsr   r   r=  r1   r1   r2   test_readonly_array  s   zTestDet.test_readonly_arrayc                 C   sL   ddgdt jgg}ttdd t| W d    d S 1 sw   Y  d S )Nr?   r>   rM   zarray must not containr/  )r)   infrs   rt   r   r=  r1   r1   r2   test_simple_check_finite  s   
"z TestDet.test_simple_check_finite)r   r   r   r   r  r  r   r   r   r  r  r)   	typecodesr  r  r  r   r   r	   r   r   r  r  r  r  r1   r1   r1   r2   r|  D  s     

$%

r|  c                 C   s2   t | }|r
t|}t|| }t||}t||S )N)r   r   r   r   )rU   r]   cmplxata1b1r1   r1   r2   direct_lstsq  s   


r  c                	   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zej	
d
eej	
ddej	
deej	
dddd Zej	jeddej	
d
eej	
ddej	
deej	
dddd Zdd Zdd Zdd Zdd Zej	
deeejeejgej	
deeejeejgd d! Zd"S )#	TestLstsq)ZgelsdZgelssgelsyNc                 C   s   t D ]b}tjddgddgg|d}tjD ]O}dD ]J}dD ]E}| }tj||d}| }t|||||d}	|	d	 }
|	d
 }t|d
kd|  tt	||
|dt
|j dt
|j d| d qqqqd S )Nr?   r8   r:   r;   r   TF)r?   r   r   r  )rI   r:   r;   lapack_driverrb  rc  r   r>   expected efficient rank 2, got r  driver: rI  )REAL_DTYPESr)   r   r  lapack_driversrg  r   r   r   r   r3   r~   )rT   r~   rU   r  r]  btr  r]   r  outr^   r  r1   r1   r2   test_simple_exact  s6   
zTestLstsq.test_simple_exactc              
   C   s8  t D ]}tjddgddgddgg|d}tjg d|d}tjD ]x}dD ]s}| }| }t|||||d	}|d
 }	|dkrLt|||	 d }
n|d }
|d }t	|dkd|  t
tt||	| d jd
d|
dt|j dt|j d| d t
|	ddt|j dt|j d| d q$q qd S )Nr?   r>   r;   r   rM   r   r   r  r  r   r  r  r_  r  r  r|   rJ  rK  )gm۶mۿgm۶m?)r  r)   r   r  r  rg  r   rf  r   r   r   r	  r3   r~   )rT   r~   rU   r]   r  r]  r  r  r  r^   	residualsr  r1   r1   r2   test_simple_overdet   s>    
zTestLstsq.test_simple_overdetc              
   C   s@  t D ]}tjddgddgddgg|d}tjg d|d}tjD ]|}dD ]w}| }| }t|||||d	}|d
 }	|dkrP|||	 }
t|
|
	  }n|d }|d }t
|dkd|  ttt||	| d jd
d|dt|j dt|j d| d t|	ddt|j dt|j d| d q$q qd S )Nrp  r>   r;   r   rM   r   )r?   r   rM   r  r  r   r  r?   r  r_  r  r  r  )yu{޿E(B?yӽu{?(YJV?)COMPLEX_DTYPESr)   r   r  r  rg  r   r   rf  r  r   r   r	  r3   r~   )rT   r~   rU   r]   r  r]  r  r  r  r^   r  r  r  r1   r1   r2   test_simple_overdet_complex  sB    
z%TestLstsq.test_simple_overdet_complexc              
   C   s   t D ]\}tjg dg dg|d}tjddg|d}tjD ]@}dD ];}| }| }t|||||d}|d }	|d }
t|
dkd	|
  t|	d
dt	|j
 dt	|j
 d| d q!qqd S )Nr   rr  r   r?   r>   r  r  r   r  )gqqgqq?gdq?r  r  r  )r  r)   r   r  r  rg  r   r   r   r3   r~   )rT   r~   rU   r]   r  r]  r  r  r  r^   r  r1   r1   r2   test_simple_underdet>  s,   
zTestLstsq.test_simple_underdetr~   r   )r8   r  r  r]  r  c                 C   s4  t jd}t j|||g|d}t|D ]}dd|||f   |||f< qtdD ]l}t j||dg|d}| }	| }
t|	|
|||d}|d }|d	 }t||kd
| d|  |t ju r~t	t
|||dt|	j dt|	j d| d q+t	t
|||dt|	j dt|	j d| d q+d S )Nr   r   r8   r  r;   rM   r  r   r>   expected efficient rank , got i  r  r    )r)   r
   RandomStateasarrayr  rg  r   r   r	   r   r   r3   r~   rT   r~   r   r  r]  r2  rU   r   r]   r  r  r  r^   r  r1   r1   r2   test_random_exactT  s@   


zTestLstsq.test_random_exactz$may segfault on Alpine, see gh-17630rD  c                 C   sF  t jd}t j|||gd|||g  |d}t|D ]}dd|||f   |||f< qtdD ]l}t j||dg|d}| }	| }
t|	|
|||d}|d	 }|d }t||kd
| d|  |t ju rt	t
|||dt|	j dt|	j d| d q4t	t
|||dt|	j dt|	j d| d q4d S )Nr   rd   r   r8   r  r>   rM   r  r   r  r  i  r  r  r  )r)   r
   r  r  r  rg  r   r   r   r   r   r3   r~   r  r1   r1   r2   test_random_complex_exactx  sB   "


z#TestLstsq.test_random_complex_exactc                 C   s(  t jd}tD ]}dD ]\}}tjD ]|}dD ]w}t j|||g|d}t|D ]}dd|||f   |||f< q)tdD ]O}t j||dg|d}	| }
|	 }t	|
||||d	}|d
 }|d }t
||kd| d|  t|t||	d
ddt|
j dt|
j d| d q>qqqqd S )Nr   )r8      )r  r>   r  r   r8   r  r;   rM   r  r   r>   r  r  r  r  r  r  )r)   r
   r  r  r  r  r  r  rg  r   r   r   r  r3   r~   rT   r2  r~   r   mr  r]  rU   r   r]   r  r  r  r^   r  r1   r1   r2   test_random_overdet  sB   
zTestLstsq.test_random_overdetc                 C   s:  t jd}tD ]}dD ]\}}tjD ]}dD ]}t j|||gd|||g  |d}t|D ]}dd|||f   |||f< q2tdD ]O}t j||d	g|d}	| }
|	 }t	|
||||d
}|d }|d }t
||kd| d|  t|t||	dddt|
j dt|
j d| d qGqqqqd S )Nr   r  r  rd   r   r8   r  r>   rM   r  r   r  r  r?   r  r  r  r  )r)   r
   r  r  r  r  r  r  rg  r   r   r   r  r3   r~   r  r1   r1   r2   test_random_complex_overdet  sF   
"z%TestLstsq.test_random_complex_overdetc              	   C   s   t  }|td W d    n1 sw   Y  td}ttdtj	ddD ]P\}}}}}|
|}tj||d}	| }
|	 }t|
|||||d}|d }|d }t|dkd	|  tt|||	d
t|j d
t|j d| d q(d S )NzIinternal gelsd driver lwork query error,.*Falling back to 'gelss' driver.))r?   r8   r  r  r  r   )r  ro   rb  rc  r   r>   r  r  r  r  )r   filterRuntimeWarningr)   r   rL  rM  r  r  r  r;  rg  r   r   r   r   r3   r~   )rT   supr  r~   r  r  r]  ro   rU   r]   r  r  r  r^   r  r1   r1   r2   rp     s<   

zTestLstsq.test_check_finitec           	   	   C   s   dD ]M\}}t |}tt ||\}}}}t|t |d f|dd    |d r1t dn	t jj|ddd }t|| t|dkd t|t d qd S )N))r   r>   r   ))r   r;   r  )r;   r   )r;   )r  )r;   r>   r?   r   r   r_  r>   zexpected rank 0)	r)   r   r   r   r   r   rh  r   r   )	rT   Za_shapeZb_shaper]   r^   residuesranksZresidues_should_ber1   r1   r2   r     s   
"
zTestLstsq.test_emptyrR  r   c           
      C   sr   t jd|d}t jd|d}t||\}}}}|jdksJ tt jd|dt jd|dd j}	|j|	ks7J d S rT  )r)   r   r   r.  r   r   r~   )
rT   rR  r   rU   r]   r^   r  r  r  rV  r1   r1   r2   r    s   $zTestLstsq.test_empty_dtypeN)r   r   r   r  r  r  r  r  r   r   r   r  r  skipifr'   r  r  r  r  rp   r   r   r   r)   r	   r   r   r  r1   r1   r1   r2   r    s0    !   r  c                   @   sv   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ejdeejeejgdd ZdS )TestPinvc                 C   r   r   r   r   r1   r1   r2   r     r   zTestPinv.setup_methodc                 C   s@   t g dg dg dgtd}t|}tt||td d S Nr   rr  rs  r   rM   r   r   r   r   r   r)   r   rT   rU   a_pinvr1   r1   r2   test_simple_real  s   zTestPinv.test_simple_realc                 C   sb   t g dg dg dgtddt g dg dg dgtd  }t|}tt||td	 d S 
Nr   rr  rs  r   rd   )r  rt  rB   )r<   r   r;   )rM   r>   r?   rM   r  r  r1   r1   r2   r     s   zTestPinv.test_simple_complexc                 C   sN   t g dg dg dgtd}t|}t g dg dg dg}t|| d S )Nr   rr  rB   rt  r  r   g|qgԕVUUſgc8?gqg^0<gq?g9?gԕVUU?g:87ȿr   r   r   r   rT   rU   r  r   r1   r1   r2   test_simple_singular!  s   zTestPinv.test_simple_singularc                 C   sH   t g dg dgtd}t|}t ddgddgdd	gg}t|| d S )
Nr   rr  r   g֋8g#q?g#qg#q?gIq?g#q̿r  r  r1   r1   r2   test_simple_cols)  s   zTestPinv.test_simple_colsc                 C   sH   t ddgddgddggtd}t|}t g dg d	g}t|| d S )
Nr?   r>   rM   r;   r   r<   r   )gDpTUUgQUUտgvWUU?)gDpTUU?gQUU?g&>ڿr  r  r1   r1   r2   test_simple_rows1  s   zTestPinv.test_simple_rowsc                 C   s@   t g dg dg dg}t|dd}tt||td d S )Nr   )r;   r   r   rs  Frn   rM   )r   r   r   r   r)   r   r  r1   r1   r2   rp   8  s   zTestPinv.test_check_finitec                 C   sF   g dg dg dg}t |}tg dg dg dg}t|| d S )Nr   rr  r  r  r  r  )r   r   r   r  r1   r1   r2   test_native_list_argument=  s   z"TestPinv.test_native_list_argumentc                 C   s   d}t tj||\}}tddd}| }d|d< d}d}t||d	d
}|| | | }	|| | | }
ttj	
|	ddd ttj	
|
ddd t|||d
}|| | | }	|| | | }
ttj	
|	ddd ttj	
|
ddd d S )N   g     A@rB   r   gMbP?ry   h㈵>g?rE   rJ  r|   gMb@?rJ  gvIh%,=g;O@{Gz?r{   )r"   r)   r
   r6  r   rR   rg  r   r   rh  r   )rT   r   q_a_mrU   rJ  r|   a_padiff1adiff2r1   r1   r2   test_atol_rtolE  s"   zTestPinv.test_atol_rtolr0   c                 C   rz  rT  )r)   r   r   r.  r~   r   rT   r0   rU   r  r1   r1   r2   r   `  r{  zTestPinv.test_emptyN)r   r   r   r   r  r   r  r  r  rp   r  r  r   r   r   r   r)   r	   r   r   r   r1   r1   r1   r2   r    s    r  c                   @   sf   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	e
jdeejeejgdd ZdS )TestPinvSymmetricc                 C   r   r   r   r   r1   r1   r2   r   j  r   zTestPinvSymmetric.setup_methodc                 C   sP   t g dg dg dgtd}t||j}t|}tt||td d S r  )r   r   r)   r   r  r   r   r   r  r1   r1   r2   r  m  s   z"TestPinvSymmetric.test_simple_realc                 C   s|   t g dg dg dgtd}t||j}tj|\}}}|d  d9  < t|| |}t|}t|}t	|| d S )Nr   rr  r  r   r   rA   )
r   r   r)   r   r  rh  Zsvdr   r   r   )rT   rU   rX   r  vtr  Za_pinvhr1   r1   r2   test_nonpositives  s   z"TestPinvSymmetric.test_nonpositivec                 C   sv   t g dg dg dgtddt g dg dg dgtd  }t|| j}t|}tt||td	 d S r  )	r   r   r)   r   r  r  r   r   r   r  r1   r1   r2   r   }  s   z%TestPinvSymmetric.test_simple_complexc                 C   sT   t g dg dg dgtd}t||j}t| }tt||td d S r  )	r   r   r)   r   r  r   tolistr   r   r  r1   r1   r2   r    s   z+TestPinvSymmetric.test_native_list_argumentc                 C   sT   t g dg dg dg}t|}t|| | |dd t|| | |dd d S )N)r?   rA   r   )rA   r>   rA   )r   rA   r?   rz   r  )r)   r   r   r   )rT   rU   pr1   r1   r2   test_zero_eigenvalue  s   z&TestPinvSymmetric.test_zero_eigenvaluec                 C   s  d}t tj||\}}tg ddg|d   }|j| | }tg ddg|d   }|j| | }d}d}t||dd	}|| | | }	|| | | }
tt|	|d
d tt|
ddd t|||d	}|| | | }	|| | | }
tt|	dd
d tt|
dd
d d S )Nr  )r;   rM   r>   r?   vk?gﭣ>gu>r<   )r;   rM   r>   r?   r  rE   rE   r  g1?r  r  r{   rH  gdy=r  -C6?)	r"   r)   r
   r6  ri   r  r   r   r   )rT   r   r  r  rU   r  rJ  r|   r  r  r  r1   r1   r2   r    s$   z TestPinvSymmetric.test_atol_rtolr0   c                 C   sF   t jd|d}t|}|jdksJ |jtt jd|djks!J d S rT  )r)   r   r   r.  r~   r   r   r  r1   r1   r2   r     r{  zTestPinvSymmetric.test_emptyN)r   r   r   r   r  r  r   r  r   r  r   r   r   r   r)   r	   r   r   r   r1   r1   r1   r2   r  h  s    
r  scale)g#B;r7   @xDpinv_c                 C   sD   t ddgddgg|  }t dt | }||}t|| d S )Nr?   r   g|=r7   )r)   r   ri   r   )r  r  r^   r   Zx_invr1   r1   r2   test_auto_rcond  s   r  c                   @   sV   e Z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dd ZdS )TestVectorNormsc                 C   s   t jd D ]0}t jg d|d}tdt |jjd }tt|t 	d|d tt|dt 	d|d qt jd	 D ]0}t jg d
|d}tdt |jjd }tt|t 	d|d tt|dt 	d|d q;d S )NZAllFloatr   r   rz   r8   rC   r{   r>   Complex)rd   ra   y              @)
r)   r  r   maxr.   r/   realr   r   sqrt)rT   r~   r^   rP  r1   r1   r2   
test_types  s   zTestVectorNorms.test_typesc                 C   s    t dgtd}tt|| d S )Nr  r   )r   r	   r   r   r=  r1   r1   r2   test_overflow  s   zTestVectorNorms.test_overflowc                 C   sd   t dgdgd  td}ztt|d ddd W d S  ty1   d}tt|d d	|d
 Y d S w )N     @r?   i'  r   rx   r  r  zO: Result should equal either 0.0 or 0.5 (depending on implementation of snrm2).rE   )rK  )r   r	   r   r   AssertionErrorr   )rT   rU   r  r1   r1   r2   test_stable  s   zTestVectorNorms.test_stablec                 C   s,   t tg ddd t tg ddd d S )N)r?   r   rM   r   r>   r   rM   )r   r   r   r1   r1   r2   test_zero_norm  s   zTestVectorNorms.test_zero_normc                 C   s^   t ddgddgggd d}tt|ddddggd  tt|dddd	gd gd  d S )
Nr>   r?   rM   r;   r3  r_  5D+@6f~@r  )r)   r   r   r   r=  r1   r1   r2   test_axis_kwd  s   $zTestVectorNorms.test_axis_kwdc                 C   sx   t ddgddgggd d}t|ddd}t|dd	gggd  t|jd
k tt|dddddgdgggd  d S )Nr>   r?   rM   r;   r3  T)r`  keepdimsr  r  )r>   r?   r>   rq   g      @)r)   r   r   r   r   r   r!  r1   r1   r2   test_keepdims_kwd  s
   (z!TestVectorNorms.test_keepdims_kwdz64-bit BLAS requiredrD  c                 C   s<   t dd tjdgtjd}d|d< t|}~t|d d S )NihB  )Zfree_mbl        r   r?   rA   r7   )r&   r)   r   r+   r   r   )rT   r^   r  r1   r1   r2   test_large_vector  s   
z!TestVectorNorms.test_large_vectorN)r   r   r   r  r  r  r  r  r  r   r   r  r(   r  r1   r1   r1   r2   r    s    r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestMatrixNormsc           	   
   C   s   t jd dD ]p\}}t jt jt jt jt jfD ]_}dt j||	| }t 
|jt jr@|dt j||  	|}t j}nt j}d ddddd	t jt j fD ]&}t||d
}t jj||d
}t ||svt jj|	||d
}t|| qPqqd S )Nr   )rg   )r?   rM   )rM   r?   )r;   r;   r  )r   r;   r  y              $@Zfror?   rA   r>   )ord)r)   r
   r   r	   r+   r   r-   Zint64rN  r;  rd  r~   re  r  r   rh  Zallcloser   )	rT   r   r  r  r   Zt_highra  actualZdesiredr1   r1   r2   test_matrix_norms  s$   
z!TestMatrixNorms.test_matrix_normsc                 C   s  t ddgddgggd d}t|t jdd}tt |ddt jd	d}t|dd	d}t|| t|| t|| t|j|j  koG|jkn   t|ddd}tt |dddd	d}t|t jd	d}t|| t|| t|| t|j|j  ko|jk d S    d S )
Nr>   r?   rM   r;   r3  r  )r  r`  r   r   )r)   r   r   r  swapaxesr   r   r   )rT   rU   r]   r  r3  r1   r1   r2   r    s   


"


,zTestMatrixNorms.test_axis_kwdc                 C   sZ   t jddddddd}t|t jdd	d
}t|ddd	d
}t|| t|j|jk d S )Nx   r3  r   r>   rM   r;   r   r  T)r  r`  r  r?   r   )r)   r   rR   r   r  r   r   r   )rT   rU   r]   r  r1   r1   r2   r  "  s
   
z!TestMatrixNorms.test_keepdims_kwdc                 C   s   t d}tt|d tt|ddt d tt|ddt d t d	}tt|d tt|ddt d
 tt|ddt d d S )Nry   rE   r   r_  r   T)r  rg   )r   rM   r  )r)   r   r   r   r   r=  r1   r1   r2   r   )  s   

zTestMatrixNorms.test_emptyN)r   r   r   r  r  r  r   r1   r1   r1   r2   r    s
    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S )TestOverwritec                 C      t tddg d S NrM   rM   r  )r%   r   r   r1   r1   r2   
test_solve6  r}  zTestOverwrite.test_solvec                 C   r   r!  )r%   r   r   r1   r1   r2   test_solve_triangular9  r}  z#TestOverwrite.test_solve_triangularc                 C   s   t dd ddg d S )Nc                 S   s   t d| |S )NrI   )r   )rV   r]   r1   r1   r2   <lambda>=  s    z1TestOverwrite.test_solve_banded.<locals>.<lambda>)r;   r<   r<   r$   r   r1   r1   r2   test_solve_banded<  s   zTestOverwrite.test_solve_bandedc                 C   r   )N)r>   r<   r&  )r%   r   r   r1   r1   r2   test_solveh_banded@  r}  z TestOverwrite.test_solveh_bandedc                 C      t tdg d S Nr"  )r%   r   r   r1   r1   r2   test_invC  r   zTestOverwrite.test_invc                 C   r)  r*  )r%   r   r   r1   r1   r2   test_detF  r   zTestOverwrite.test_detc                 C   r   )N)rM   r>   r  )r%   r   r   r1   r1   r2   
test_lstsqI  r}  zTestOverwrite.test_lstsqc                 C   r)  r*  )r%   r   r   r1   r1   r2   	test_pinvL  r   zTestOverwrite.test_pinvc                 C   r)  r*  )r%   r   r   r1   r1   r2   
test_pinvhO  r   zTestOverwrite.test_pinvhN)r   r   r   r#  r$  r'  r(  r+  r,  r-  r.  r/  r1   r1   r1   r2   r  5  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deeejeejgejdeeejeejgdd ZdS )TestSolveCirculantc                 C   sB   t g d}t g d}t||}tt||}t|| d S N)r?   r>   rM   r   )r?   rA   r?   r   )r)   r   r   r   r   r   rT   r  r]   r^   yr1   r1   r2   test_basic1U  s
   
zTestSolveCirculant.test_basic1c                 C   sF   t g d}t ddd}t||}tt||}t|| d S )Nr?   r>   r   r  r;   rM   r)   r   r   rR   r   r   r   r   r2  r1   r1   r2   test_basic2\  s
   
zTestSolveCirculant.test_basic2c                 C   sH   t g d}t dddd}t||}tt||}t|| d S )Nr5     r;   rM   r>   r7  r2  r1   r1   r2   test_basic3d  s
   
zTestSolveCirculant.test_basic3c                 C   sJ   t g d}t dddd }t||}tt||}t|| d S )N)rp  r6  r   r   rt  r;   r>   y              ?r7  r2  r1   r1   r2   re   l  s
   
zTestSolveCirculant.test_complexc                 C   sF   t jd}|d}|d}t||}tt||}t|| d S )Ni1  r,  )r)   r
   r  rN  r   r   r   r   )rT   r2  r  r]   r^   r3  r1   r1   r2   test_random_b_and_ct  s   


z&TestSolveCirculant.test_random_b_and_cc                 C   s\   t g d}t g d}t||dd}tt||\}}}}t|| ttt|| d S )Nr?   r?   r   r   )r?   r>   rM   r;   r   )Zsingular)r)   r   r   r   r   r   rs   r   )rT   r  r]   r^   r3  r  Zrnkr  r1   r1   r2   test_singular}  s   
z TestSolveCirculant.test_singularc                 C   s  t g dgg dgg}t g dg dg dg}t||dd}t|jd t |}tt|d	  |j	|d d d	d d f< tt|d  |j	|d d dd d f< t
|| t||dd
d}t|jd t
t |d
d	| tt |dd|j	dd}t|jd t
|| d S )N)rA   g      @rM   g      @)r?   r<   r<   g      @)r   r   r?   r?   r<  )r?   rA   r   r   r?   )baxis)r;   r>   rM   r   rA   )r>  Zoutaxis)r>   rM   r;   r>   )Zcaxis)r)   r   r   r   r   
empty_liker   r   r  r  r   Zmoveaxisr  )rT   r  r]   r^   r   r1   r1   r2   test_axis_args  s   
**
z!TestSolveCirculant.test_axis_argsc                 C   s6   g d}g d}t ||}tt||}t|| d S r1  )r   r   r   r   r2  r1   r1   r2   r     s
   
z-TestSolveCirculant.test_native_list_argumentsdt_cr   c                 C   s   t jg |d}t jg |d}t||}|jdksJ |jtt jd|dt jd|djks/J t jd|d}t||}|jdksBJ |j|jksJJ d S )Nr   r   rM   ry   )r)   r   r   r   r~   r   r   r   )rT   rA  r   r  r]   r^   x1r1   r1   r2   r     s   

zTestSolveCirculant.test_emptyN)r   r   r   r4  r8  r:  re   r;  r=  r@  r   r   r   r   r   r   r)   r	   r   r   r   r1   r1   r1   r2   r0  S  s    		r0  c                   @   sh   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	e
jdeeejeejgdd ZdS )TestMatrix_Balancec                 C   s   t ttd d S )NzSome string for fail)rs   rt   r!   r   r1   r1   r2   test_string_arg  r   z"TestMatrix_Balance.test_string_argc                 C   sD   t tttddgdtjgg t tttddgdtjgg d S )Nr?   r>   rM   )rs   rt   r!   r)   r   r  nanr   r1   r1   r2   test_infnan_arg  s   z"TestMatrix_Balance.test_infnan_argc                 C   s@   t tddgddgg\}}tttt|dg d S )Nr  r?   r   r   )r!   r)   r   r   difflog2ri   )rT   r  r3  r1   r1   r2   test_scaling  s   "zTestMatrix_Balance.test_scalingc                 C   sB   t g dg dg dg}t|\}}tt|||| d S )N)r?   r   r  )r?   r?   r  )r  g      Y@r?   )r)   r   r!   r   r   r   )rT   r   r^   r3  r1   r1   r2   test_scaling_order  s   z%TestMatrix_Balance.test_scaling_orderc                 C   sR   t tddgddggdd\}\}}ttt|dg t|td d S )Nr  r?   r   Zseparater   r>   )r!   r)   r   r   rG  rH  r   r   )rT   r  r3  zr1   r1   r2   test_separate  s
   z TestMatrix_Balance.test_separatec                 C   s`   t tdttdtd}t|dd\}\}}t|t| t|tg d d S )N)r>   r>   r"  r?   rK  )r   r?   r<   r   r;   rM   r>   )r    r)   r   r  r!   r   Z	ones_liker   )rT   r   r^   r3  rL  r1   r1   r2   test_permutation  s   z#TestMatrix_Balance.test_permutationc              	   C   s   t g dg dg dg dg dgt g dg dg dg dgt g d	g d
g dg dgf}|D ]:}t|\}}t|dd\}\}}t |}t |jd ||< t|t ||d d f  tt||	|| q7d S )N)rE   rE   rE   rE   >)rE   rE   rE   rE   rE   )rL   rL   rE   rE   rE   )rE   rE   rO  rE   rE   )rn  rE   rE   rE   )rE   r  rE   rE   )r7   rE   rn  rE   )rE   r7   rE   r  )r  rE   r7   rE   )r  r         r7   )r  rP  rP  rE   )r  rP  r7   r  r?   rK  r   )
r)   r   r!   r?  r   r   r   ri   r   r   )rT   casesr   r^   r3  r  r  ipr1   r1   r2   test_perm_and_scaling  s2   



z(TestMatrix_Balance.test_perm_and_scalingr0   c                 C   s   t jd|d}t|\}}|jdksJ |jdksJ tt jd|d\}}|j|jks.J |j|jks6J t|dd\}\}}|jdksGJ |jdksNJ |jdksUJ t|dd\}\}	}
|j|jksgJ |j|	jksoJ |j|
jkswJ d S )Nry   r   r   r>   TrK  )r)   r   r!   r.  r   r~   )rT   r0   rU   r]   r  Zb_nZt_nr  permZscale_nZperm_nr1   r1   r2   r     s   zTestMatrix_Balance.test_emptyN)r   r   r   rD  rF  rI  rJ  rM  rN  rS  r   r   r   r   r   r)   r	   r   r   r   r1   r1   r1   r2   rC    s    rC  r   )LrL  numpyr)   r   r   r   r   r   r   r   r	   Znumpy.randomr
   Znumpy.testingr   r   r   r   r   r   r   r   r   rs   Zscipy.linalgr   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   Zscipy.linalg._testutilsr%   Zscipy._lib._testutilsr&   r'   Zscipy.linalg.blasr(   r+   r*   r  r   r-   r,   r  ZDTYPESr3   r4   r   r   rk  rq  r|  r  r  r  r  r   r   r  r  r  r  r0  rC  r1   r1   r1   r2   <module>   sT    ($L
 (  N   *R2 
	  /WN<:d