U
    Hvfby                     @   s   d dl Z d dlZd dlmZ d dlZd dlmZ d dlm	Z	 d dlm
Z
mZ d dlmZmZ d dlmZmZmZ d dlmZ d	d
 ZG dd dZdd Zdd Zdd Zdd Zdd ZG dd dZdS )    N)assert_array_almost_equal)raises)solve_sylvester)solve_continuous_lyapunovsolve_discrete_lyapunov)solve_continuous_aresolve_discrete_are)
block_diagsolveLinAlgError)matrixc              
   C   sN   t jt jt jtd| }t|}t|	 W  5 Q R  S Q R X dS )zo
    Load npz data file under data/
    Returns a copy of the data, rather than keeping the npz file open.
    dataN)
ospathjoinabspathdirname__file__nploaddictitems)namefilenamef r   C/tmp/pip-unpacked-wheel-96ln3f52/scipy/linalg/tests/test_solvers.py
_load_data   s     r   c                   @   s  e Zd Zeddgddggeddgddggfed	d
gddggeddgdd
ggfedd
gddggeddgdd
ggfed	d
gddgged
d
gdd
ggfe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e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feddddddddd d!d"gd#d$d$d$d$d$d$d$d$d$d$gd$d#d$d$d$d$d$d$d$d$d$gd$d$d#d$d$d$d$d$d$d$d$gd$d$d$d#d$d$d$d$d$d$d$gd$d$d$d$d#d$d$d$d$d$d$gd$d$d$d$d$d#d$d$d$d$d$gd$d$d$d$d$d$d#d$d$d$d$gd$d$d$d$d$d$d$d#d$d$d$gd$d$d$d$d$d$d$d$d#d$d$gd$d$d$d$d$d$d$d$d$d#d$ggedfeddgd%d&ggeddgjeddgjj feddgd%d&ggeeddgjeddgjj fgZd'd( Z	d)d* Z
d0d,d-Zd.d/ Zd+S )1TestSolveLyapunov            	   
               ?      ?       @      @            @       @              @       @                  ?      @               r      y?        yK?        yˡE?        y㥛 ?        yMb?        y)\(?        yZd;O?        yl?        yy&1?        y~jt?        y{Gz?        y      ?        y                g      c                 C   sH   t d}t d}ttt|| ttt|| ttt|t d d S )Nr!   r    r!   r    )r   oneseyeassert_raises
ValueErrorr   )selfnsqsqr   r   r   $test_continuous_squareness_and_shapeX   s
    

z6TestSolveLyapunov.test_continuous_squareness_and_shapec                 C   s4   t ||}tt||t||   | d S N)r   r   r   dotconj	transpose)r;   aqxr   r   r   check_continuous_case_   s
    
 z'TestSolveLyapunov.check_continuous_caseNc                 C   s<   t |||d}ttt|||  | d|  d S )Nmethodr0   )r   r   r   r@   rA   rB   )r;   rC   rD   rH   rE   r   r   r   check_discrete_cased   s
     z%TestSolveLyapunov.check_discrete_casec                 C   sh   | j D ]\}| |d |d  | |d |d  | j|d |d dd | j|d |d dd qd S )Nr   r   directrG   Zbilinear)casesrF   rI   r;   caser   r   r   
test_casesi   s
    
zTestSolveLyapunov.test_cases)N)__name__
__module____qualname__r   arrayr8   r   TrK   r>   rF   rI   rN   r   r   r   r   r      s   ( (     
    
    
    
    
    
    
    
    
    
    !#"<
r   c            
      C   sZ  t d} t d}t d}t d}t d}tdgdtdgdggtdd	dd ftd
dgddggtdgdggtddgddggdd f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gddgddg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 ftd,d-ddddddgd.d/d0dddddgdd.d1d0ddddgddd.d2d3dddgdddd4d5d6ddgddddd4d7d8dgdddddd4d9d:gddddddd4d;ggtd<dd=d>d?d@d>dAgdBdCdDdEdFdGdHdIggjdJ tddKdKdKdLdKdKdMgdKddKdKdMdKdKdKgdKdKddKdKdLdKdKgdKdKdKddKdKdKdKgdLdMdKdKdMdKdKdKgdKdKdLdKdKdMdKdKgdKdKdKdKdKdKdMdKgdMdKdKdKdKdKdKdMggtd+d ftdNdOdKdKdPdKdKdKdQg	dRdSdKdKdTdKdKdKdUg	dVdWdXdKdYdKdKdKdZg	d[d\d]d^d_dKdKdKd`g	dadbdcdddedKdKdKdfg	dddddgdhdKdidKg	ddddddgdhddg	ddddddjdKdkdg	dddddjdKdKdldkg	g	tdmdndogdpdqdKgdrdsdKgdtdudKgdvdwdKgdKdKdKgdKdKdKgdKdKdKgdKdKdKgg	tdtdd f| dx | dy | dz | d{ d ftddgdd|ggtd}gdggtd~ddftddtdMdKgdJdmggtddgddggtd~td}d d ftddgddggtdgdggtd+dd ftddgddggtd+td+td+d ftddgd
d+ggtdgdggtddgdd|ggdd ftdddgdddgdKddggd tdtdd|d|gd|dd|gd|d|dggtd}ddgtdd|d|gd|dd|gd|d|dggd tdd dftddddgddddgddddgddddggtddddggjtddddgdd ftddddgddddgddd}dgdddd}ggtdtddd f|dx |dy |dz |d{ d ftjddddtddd|  t	tdt
dd tjdddd tdtdtdd fttddttddtddtddj ddf|dx |dy |dz |d{ d f|dx |dy |dz |d{ df|dx |dy |dz |d{ dfg}d}dd }t|D ]\}}	||	||  q<d S )Nzcarex_6_data.npzzcarex_15_data.npzzcarex_18_data.npzzcarex_19_data.npzzcarex_20_data.npzr.   r   r   r(   r"   r!               r5   r#   r3         @g=
ףp=g(\?gQg rhgףp=
gq=
ףp@g rh?g/nRgGzgzGʿg
ףp=
?ggffffffgMbgQ?g/$@g7A`@gjt?gZd;O?g/$@g|?5^?gy&1?gx&1?g&1?gsh|??r    gʡEg!rh?gNbX9?g7A`gOn?gSgS㥛g`"?g/$?g=
ףp=g rh?gK7gE?g^I+gtV?gJ+gQ@gB@gp=
ף@gzG@g
ףp=
@r/   g
ףp=
gRQgffffffg(\g(\
g(\g{GzgGzMbP?        g      ?皙?g~jtg{Gz@g- gףp=
?g/$ֿgZd;O?gQg
ףp=
?gA`ТgMb.@g-Fggq=
ףp@g7A`5g!rhA@gV-տg(\g1g(\@g+Ngy&1X@gT㥛Ġg(\?g/$Jgffffff4@g     W@gffffffbgJ@g)@g?g2@{Gz?gI+gSÿg~jth?g/$g;On?gh|?5g~jt?g#~jĿg rh?g{GzܿABQRg       gư>r    r    zBad residual accuracygg{Gzd   i  i'      .Ag  ?ig    ZAg    >Ag       g    `VAg    >g    SAzBad Residual Accuracyg?gGz?g    g    ag    Ag    .gư)r"   r   )r"   r"   @   k)>   rf   )      )   r&      ri   r%   r3   Nr1   r4   ri   ri   Nr#   ri   rj   ri   Nr&   NNc           
      S   s   | \}}}}}|rt j|d t||||}||| j| | }||}	||	tt||	 j8 }t	|t
||d dS )z3Checks if 0 = XA + A'X - XB(R)^{-1} B'X + Q is truereasondecimalN)pytestxfailr   r@   rA   rS   r
   r   
atleast_2dr   
zeros_like)
rM   decrC   brD   rknownfailurerE   resout_factr   r   r   _test_factory&  s    
 z0test_solve_continuous_are.<locals>._test_factory)r   r   diagrR   r	   r8   rS   r7   r@   Zrot90zerosflipud	enumerate)
Zmat6Zmat15Zmat18Zmat19Zmat20rK   min_decimalry   indrM   r   r   r   test_solve_continuous_areq   sl   


 



	" 



	


	"  -r   c            	   "   C   s~  t ddgddggt dgdggt ddgddggt dggd ft ddgddggt dgdggt ddgddggt dggd ft d	dgddggt ddgdd	ggt dd
gddggt ddgdd	ggd ft dddgdddgdddggt dgdgdggt d	t dd ft dd	gddggt dgdggt ddgddggt dggd ft ddgddggt d d gd!d"ggt d#dgdd$ggt d%dgdd	ggd ft ddgddggt dgdggt ddgddggt dggd ft ddgddggt ddgddggt d&d&gd&d'ggd( t dd	gd	dggd ft ddgddggt dgdggt ddgddggt dggd f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$gd/d0gd1d2gd3d/ggt d4ddd5gdd6d7dgdd7d8dgd5ddd9ggt dd ft d:d;d<d=gd>d?d@dAgdBdCdDdEgdFdGdHdIggt dJdKgdLdMgdNdOgdPdQggt ddR t dd ft dSdTdUdVgdWdXdYdZgd[dWd\d]gd[d[d[d^ggt dWd_d_d_gd[dWd_d_gd[d[dWd_gd[d[d[dWggt ddd	dgdddd`gd	dddagdd`dadbggt dd ft dcdddedfdggdhdidjdkdlgdmdndodpdqgdrdsdtdudvgdwdxdydzd{ggdR t d|d}gd~dgddgddgddggdR t d`t dd ft t dt jddgddt t dt dgdgdgg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ddddddgddddddggt d	dgddggd fdt dddddddddg	dddddddddg	dddddddddg	dddddddddg	dddddddddg	dddddddddg	dddddddddg	dddddddddg	dddddddddg	g	 t dddgdddgdddgdddgdddgdddgdddgdddgdddgg	d t dddddddddg	t d	d ft ddgddggt dgdggt dt dggdft dddgdddgddd'ggd t d	dt d	 dt d	 dft ddddgddddgddddgddddggt dgdgdgdggt ddddgt dggd ft jdddt t ddt dt dggd fg} d}dd }t| D ]\}}||||  qt t d}d|d< t dddgdddggj	}t 
|dt ddd g }t dd/g}ttt|||| d S (  Nr    y      ?       r   y             r   r5   y                            ?r!   r'   y      ?                     @gX=XI?gP?g'9ԭf?gҍK?gh2?gNցZ?gS?gs ,?g^L^?g=S?g>%S?gFB?r"   rT   rU   r#   r3   g ~:p?g2w-!?g5^I@gx&1gZd;O@g{Gzt?g{Gz?gUUUUUU?r4   gF]tE?gV-?gx&?gx&g/$?g/$ÿgF%uk?rY   gǺFg{Gz?g<,Ԛ}?gǺfgQ?gZd;Ͽg+?g=
ףp=?g+?gS㥛?gPn?g/tgM?g[A+QgϷK?gH`?g$([gu?gY9}g_":?g!'>տgCK?g_L@geXgg+пg Tfn?g`[H?gQnHg	v>g}k,gUW;g{/L	gOaeRN?rZ   g333333ggg>Qr.   g333333?g?gG)3@rX   g?g {\f@ggR@r0   r1   r%      g5^IW@gY8m?g&S?g&S:?g~jt?g&1lD@gjtD@g/$0@g1w-!@ge`TR'?gvo(@g~jtS:@gPnB@g\(/@gjt(@gm{r@gK)@g/$5;@gx&q5@grh|D@gNbX9?g?g      ?g\C@gRW@gJY8?gHPgH@g$(~g/$@g
ףp=
gec]@gffffffgx$(~?g/L
Frd   rW   g0@g     `@gGz.'@g]Fx?g\(Bg#J{/L?g+@g"@g33333#S@g33333@gq=
ףp)@g"u?gGzDg#?gQ@g"@g_g     Xv@i1  gHzG?g33333Yg/$?g33333'@gQ2@g     vg33333σ@g
ףp=R@g@g     qgMbX9@gQ?@g)\hH@i@g@g`gScg{GQ@g;On@gzG!U@gy_@g33333Äg=
ףp=\@g)\8VgEgGzU@g333333+@g	b@gffffffY@g33333yi  g{GZKg+g(\P@g{G(@gz6?gGzX@g{GjQ@g|fg33333r@gGz7g(\gQKN@g)\(6@g̼j@gQA@gug33333#@g{GFgmgffffffZ@g\(3@g33333ck@gfffffj@g
ףp=
@g cZB>gQTgT㥛 ?gd;Ogףp=
gʡE?g=
ףp=*gn!@gA`"@gq=
ףAg8@gGz$@g     0Wg33333P@gZd;@gQNgQ+C@g7A`@g
ףp=jBg
ףp=J4@gK7?gGz/gsh|@gv/@gHzG>gzGa-@2   ra   z*Presumed issue with OpenBLAS, see gh-16926   r$   rj   igqq?z!Issue with OpenBLAS, see gh-16926gG?g:0yE>g      ?r`   )r&   ri   rj   ri   rj   r      ri   ri   rj   ri   rj   rj   ri   r&   r    r1   r3   r$   c           	   
   S   s   | \}}}}}|rt j|d t||||}| j||| | }|| j||t|| j|| | j||8 }t|t	||d dS 5Checks if X = A'XA-(A'XB)(R+B'XB)^-1(B'XA)+Q) is truerk   rm   N)
ro   rp   r   rA   rS   r@   r
   r   r   rr   )	rM   rs   rC   rt   rD   ru   rv   rE   rw   r   r   r   ry     s    0z.test_solve_discrete_are.<locals>._test_factoryr!   r!   )r   r   r2   gffffffi)r   rR   r8   Zkronrz   r|   r}   Ztriur7   rS   Z	full_liker9   r   r   )	rK   r~   ry   r   rM   r[   r\   r]   r^   r   r   r   test_solve_discrete_are6  s   




















"
	


	  Hr   c                  C   s"  t dddgdddgddd	ggt d
dgddgddggt dt dt dddgdddgdddggt dd ft dddgdddgddd	ggt d
dgddgddggt dt dt dddgdddgdddggt dd fg} d}dd }t| D ]\}}||||  qd S )N? ??[,Y?7h?;)ƣ?7j*0	<?ɚ&ꢡ?琔ڠݸ?*[K?fSdc?6Wtk?]p?;?/LX?	Gr?m!#{?r!   r    GY? X.e?6u??p?硙v?<d&?窙?2?r6   )r$   r$   c                 S   s   | \}}}}}}}|r"t j|d t||||||}	| j|	|| j|	| | }
| j|	|| }|
|tt|| j8 }
t	|
t
|
|d dS r   )ro   rp   r   rA   rS   r@   r
   r   rq   r   rr   )rM   rs   rC   rt   rD   ru   esrv   rE   rw   rx   r   r   r   ry   =  s    0 z<test_solve_generalized_continuous_are.<locals>._test_factory)r   rR   r8   r{   r7   r}   )rK   r~   ry   r   rM   r   r   r   %test_solve_generalized_continuous_are  sN    

r   c                  C   sN  t d} tdddgdddgdd	d
ggtddgddgddggtdtdtdddgdddgdddggtdd ftdddgdddgdd	d
ggtddgddgddggtdtdtdddgdddgdddggtdd f| d | d | d | d  d | d! d fg}d"}d#d$ }t|D ]\}}||||  q0d S )%Nzgendare_20170120_data.npzr   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   r6   r[   r\   r]   r^   S)r%   r%   r   c              
   S   s  | \}}}}}}}|r"t j|d t||||||}	|dkrLt|jd }|dkr^t|}| j	|		|| j	|		| | }
|
| j	|		|| 	t
|| j	|		| | j	|		|| j 8 }
t|
t|
|d dS )r   rk   Nr   rm   )ro   rp   r   r   r8   shaperr   rA   rS   r@   r
   r   )rM   rs   rC   rt   rD   ru   r   r   rv   rE   rw   r   r   r   ry   z  s    
0z:test_solve_generalized_discrete_are.<locals>._test_factory)r   r   rR   r8   r{   r7   r}   )Zmat20170120rK   r~   ry   r   rM   r   r   r   #test_solve_generalized_discrete_areM  s`    

(r   c                  C   s,   dd } dd }dd }dd }d	d
 }d S )Nc               	   S   sp   t d} t d}ttfD ]N}tt|| ddd tt|||| d tt|||||  tt||||||  qd S )Nr6   r!   r   r   r7   r8   r   r   r9   r:   r<   r=   rE   r   r   r   test_square_shape  s    

z1test_are_validate_args.<locals>.test_square_shapec                  S   s   t d} t d}ttfD ]v}tt||| dd tt|||||||  tt|||t d| tt||||t d tt|||||t d qd S )Nr6   r"   r   r!   r   r   r   r   r   test_compatible_sizes  s    

z5test_are_validate_args.<locals>.test_compatible_sizesc                  S   sR   t ddd} t d}ttfD ](}tt|||| | tt|||||  q$d S )Nr#   r!   )r   Zarangereshaper8   r   r   r9   r:   )ZnsymsymrE   r   r   r   test_symmetry  s
    
z-test_are_validate_args.<locals>.test_symmetryc               	   S   s^   t dd} | d  d8  < t d}ttfD ]}tt||||||  q.ttt||||  d S )Nr   g   mBr_   r   r!   )r   fullr8   r   r   r9   r:   )Zsingr=   rE   r   r   r   test_singularity  s    
z0test_are_validate_args.<locals>.test_singularityc               
   S   s   t dt j} t d}ttfD ]v}tt|| ||| tt||| || tt|||| | tt|||||  tt||||||  tt|||||||  q d S )Nr_   r    )r   r   nanr8   r   r   r9   r:   )nmr=   rE   r   r   r   test_finiteness  s    
z/test_are_validate_args.<locals>.test_finitenessr   )r   r   r   r   r   r   r   r   test_are_validate_args  s
    	
	r   c                   @   s  e Zd Zeddgddggeddgddggedd	gd
dggfeddddgddddgddddgddddggeddddgddddgddddgddddggeddddgddddgddddgddddggfeddgddggeddgddggeddgddggfeddgddggeddgddggeddgddggfeddgddggeddgddggeddgddggfeddgddggeddgddggeddgddggfedddgdddgdddggeddgddggeddgddgddggfedddgdddgdddggeddgddggeddgdd gd!d"ggfgZd#d$ Zd%d& Zd'd( Zd)S )*TestSolveSylvesterr   r    r   r"   r1   r3   r2   r#   r$   r%   r&   r.   r(   rX   r/   r   r5   r'   r)   r*   r0   r   rV   r+   r,   r-   r!   r4   r   y      @       @y      @      y              @y              @y      @      @c                 C   s.   t |||}tt||t|| | d S r?   )r   r   r   r@   r;   rC   rt   crE   r   r   r   
check_case  s    zTestSolveSylvester.check_casec                 C   s*   | j D ]}| |d |d |d  qd S )Nr   r   r    )rK   r   rL   r   r   r   rN     s    
zTestSolveSylvester.test_casesc                 C   sf   t ddgddgg}t dgg}t ddgdd}t|||}t|t ddgdd d S )Nr.   rX   r(   r5   r   )r   rR   r   r   r   r   r   r   r   test_trivial  s
    zTestSolveSylvester.test_trivialN)	rO   rP   rQ   r   rR   rK   r   rN   r   r   r   r   r   r     s`   








  -r   )r   Znumpyr   Znumpy.testingr   ro   r   r9   Zscipy.linalgr   r   r   r   r   r	   r
   r   Zscipy.sparse._sputilsr   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s&   W F f2D1