o
    Eby                     @   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   sZ   t jt jt jtd| }t|}t|	 W  d   S 1 s&w   Y  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   A/usr/lib/python3/dist-packages/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g dg dg dg dg dgeg dg dg dg dg dgfeg dg dg dg d g d!g d"g d#g d$g d%g d&g d'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
d4d0d1Zd2d3 Zd/S )5TestSolveLyapunov            	   
               ?      ?       @      @            @       @              @       @                  ?      @      )r!   r#      r   r"   )r   r    r!      r"   )r"      r3   r3   r!   )r   r1   r    r      )r1   r!   r!   r   r1   )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"   )y?        yK?        yˡE?        y㥛 ?        yMb?        y)\(?        yZd;O?        yl?        yy&1?        y~jt?        y{Gz?        )      ?                        r6   r6   r6   r6   r6   r6   r6   r6   r6   )r6   r5   r6   r6   r6   r6   r6   r6   r6   r6   r6   )r6   r6   r5   r6   r6   r6   r6   r6   r6   r6   r6   )r6   r6   r6   r5   r6   r6   r6   r6   r6   r6   r6   )r6   r6   r6   r6   r5   r6   r6   r6   r6   r6   r6   )r6   r6   r6   r6   r6   r5   r6   r6   r6   r6   r6   )r6   r6   r6   r6   r6   r6   r5   r6   r6   r6   r6   )r6   r6   r6   r6   r6   r6   r6   r5   r6   r6   r6   )r6   r6   r6   r6   r6   r6   r6   r6   r5   r6   r6   )r6   r6   r6   r6   r6   r6   r6   r6   r6   r5   r6   r   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   rB   rC   rD   )r=   rE   rF   rJ   rG   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   ZdirectrI   Zbilinear)casesrH   rK   r=   caser   r   r   
test_casesi   s   
zTestSolveLyapunov.test_casesrA   )__name__
__module____qualname__r   arrayr:   r   TrL   r@   rH   rK   rO   r   r   r   r   r      sZ    
!#"<
r   c            
      C   s  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g dg dg dg dgtddgddgddgddggtg dg dg dg dgtdd ftg d g d!g d"g d#g d$g d%g d&g d'gtg d(g d)gjd* tg d+g d,g d-g d.g d/g d0g d1g d2gtdd ftg d3g d4g d5g d6g d7g d8g d9g d:g d;g	tg d<g d=g d>g d?g d@g dAg dAg dAg dAg	tdtdd f| dB | dC | dD | dE d ftddgddFggtdGgdggtdHddIftdJdKtdLdMgd*dNggtdOdPgdPdQggtdHtdGd d ftddRgddggtdgdggtddd ftdSdgddSggtdtdtdd ftddgd
dggtdgdggtdTdUgdUdFggdd ftg dVg dWg dXgd tdtg dYg dZg d[gtg d\tg dYg dZg d[gd tddR d]ftg d^g d_g d`g dagtg dbgjtg dcdd ftg ddg deg dfg dggtdhtdidd f|dB |dC |dD |dE d ftjdjdjddktdjdjdF  t	tdt
dld tjdjdjddk tdjtdjtdjd fttdmdttdndtdndtdndj dd]f|dB |dC |dD |dE d f|dB |dC |dD |dE d]f|dB |dC |dD |dE d]fg}do}dpdq }t|D ]\}}	||	||  qd S )rNz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!               r7   r#   r3         @r   r   r   r   )r   g=
ףp=g(\?gQ)r   g rhgףp=
gq=
ףp@)g rh?g/nRgGzgzGʿg
ףp=
?ggffffffgMbgQ?)g/$@7A`@jt?Zd;O?)rY   g/$@|?5^?y&1?)rZ   r\   gx&1?&1?)r[   r]   r^   gsh|??r    )gʡEg!rh?r   r   r   r   r   r   )NbX9?g7A`On?r   r   r   r   r   )r   r_   gSr`   r   r   r   r   )r   r   r_   gS㥛g`"?r   r   r   )r   r   r   /$?g=
ףp=g rh?r   r   )r   r   r   r   ra   gK7gE?r   )r   r   r   r   r   ra   g^I+gtV?)r   r   r   r   r   r   ra   gJ+)gQ@rW   gB@p=
ף@gzG@g
ףp=
@rb   r/   )g
ףp=
gRQgffffffg(\g(\
g(\g{GzgGzMbP?)r.           rd   rd         ?rd   rd   皙?)rd   r.   rd   rd   rf   rd   rd   rd   )rd   rd   r.   rd   rd   re   rd   rd   )rd   rd   rd   r.   rd   rd   rd   rd   )re   rf   rd   rd   rf   rd   rd   rd   )rd   rd   re   rd   rd   rf   rd   rd   )rd   rd   rd   rd   rd   rd   rf   rd   )rf   rd   rd   rd   rd   rd   rd   rf   )	g~jtg{Gz@rd   rd   g- rd   rd   rd   gףp=
?)	g/$ֿgZd;O?rd   rd   gQrd   rd   rd   g
ףp=
?)	gA`ТgMb.@g-Frd   grd   rd   rd   gq=
ףp@)	g7A`5g!rhA@gV-տg(\g1rd   rd   rd   g(\@)	g+Ngy&1X@gT㥛Ġg(\?g/$Jrd   rd   rd   gffffff4@)	r   r   r   r        W@ffffffbrd   gJ@rd   )	r   r   r   r   r   rg   rh   r   r   )	r   r   r   r   r   皙)@rd   皙?r   )	r   r   r   r   ri   rd   rd   g2@rj   ){Gz?gI+gSÿ)g~jth?g/$rd   )g;On?gh|?5rd   )g~jt?g#~jĿrd   )g rh?g{Gzܿrd   )rd   rd   rd   ABQR       ư>r    r    zBad residual accuracygg{Gzrf   rd   rk   d   i  i'      .Ag  ?i)g    ZA    >Ag       )rv   g    `VA    >)rd   rw   g    SA)r.   rp   rp   )rp   r.   rp   )rp   rp   r.   )rq   r   rt   zBad Residual Accuracy)r   g?r   r   )r   r   gGz?r   )r   g    g    ag    A)r   r   r   g    .)r   r   r   rt   )r   r   r   r   )ưr   r   r   )r7   rx   r   r   )r   r   rq   r   )r   r   r7   rq   )r"   r   )r"   r"   @   k)>   r|   )      )   r&      r   r%   r3   Nr1   r4   r   r   Nr#   r   r   r   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ZdecimalN)pytestxfailr   rB   rC   rT   r
   r   
atleast_2dr   
zeros_like)
rN   decrE   brF   rknownfailurerG   resout_factr   r   r   _test_factory&  s   
 z0test_solve_continuous_are.<locals>._test_factory)r   r   diagrS   r	   r:   rT   r9   rB   Zrot90zerosflipud	enumerate)
Zmat6Zmat15Zmat18Zmat19Zmat20rL   min_decimalr   indrN   r   r   r   test_solve_continuous_areq   sp  
 





	



		"  -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 g dg dg d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 g d#g d$g d%g d&gt d'dgd(d)gd*d+gd,d(ggt g d-g d.g d/g d0gt dd ft g d1g d2g d3g d4gt d5d6gd7d8gd9d:gd;d<ggt dd= t dd ft g d>g d?g d@g dAgt g dBg dCg dDg dEgt g dFg dGg dHg dIgt dd ft g dJg dKg dLg dMg dNgd= t dOdPgdQdRgdSdTgdUdVgdWdXggd= t dYt dd ft t dt jddgddZt t dt dgdgdggt g d[g d[g d\g d]g d^g d\gt d	dgddggd fd_t g d`g dag dbg dcg ddg deg dfg dgg dhg	 t g dig djg dkg dlg dmg dng dog dpg dqg	d_ t g drt d	d ft ddsgddggt dgdggt dt dggd ft g dtg dug dvgdw t d	dst d	 dst d	 d ft g dxg dyg dzg d{gt d|gdgdgdggt g d}t d~ggd ft jdddZt t ddt dt dggd fg} d}dd }t| D ]\}}||||  q@t t d}d|d< t g dg dgj	}t 
|dt g d }t dd(g}ttt|||| d S )Nr    y      ?       r   y             r   r7   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"   rU   rV   r#   r3   g ~:p?g2w-!?g5^I@gx&1gZd;O@g{Gzt?g{Gz?gUUUUUU?r4   gF]tE?)V-?gx&?r   r   )gx&r   r   r   )r   r   r   g/$?)r   r   g/$ÿr   gF%uk?rf   gǺFg{Gz?g<,Ԛ}?gǺf)gQ?r   r   Zd;Ͽ)r   g+?=
ףp=?r   )r   r   g+?r   )r   r   r   gS㥛?)gPn?g/tgM?g[A+Q)gϷ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?rk   )g333333ggg>Q)r.   g333333?g?gG)3@)rd   r.   g?g {\f@)rd   rd   rd   ggR@)r.   r0   r0   r0   )rd   r.   r0   r0   )rd   rd   r.   r0   )rd   rd   rd   r.   )r    r   r!   r3   )r   r    r    r1   )r!   r    r3   r%   )r3   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
Fr1   rz   )r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r7   r   )r   r   r   r7   r   r   rc   )	g0@g     `@gGz.'@g]Fx?g\(Bg#J{/L?r   g+@g"@)	g33333#S@g33333@gq=
ףp)@g"u?gGzDg#?r   gQ@g"@)	g_g     Xv@i1  gHzG?g33333Yg/$?r   g33333'@gQ2@)	g     vg33333σ@g
ףp=R@g@g     qgMbX9@r   gQ?@g)\hH@)	i@g@g`gScg{GQ@g;On@r   gzG!U@gy_@)	g33333Äg=
ףp=\@g)\8VgEgGzU@g333333+@r   g	b@gffffffY@)	g33333yi  g{GZKg+g(\P@g{G(@gz6?gGzX@g{GjQ@)	g|fg33333r@gGz7g(\gQKN@g)\(6@r   g̼j@gQA@)	gug33333#@g{GFgmgffffffZ@g\(3@r   g33333ck@gfffffj@)g
ףp=
@g cZB>gQT)gT㥛 ?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   r   r   r   r   r   r   r   r   rt   )   r$   )r$   r   )r   r   r4   gqq?)gG?r   r   r   )r   r   r   r   rX   )r   r   r   r   g:0yE>)r   r   r   r   g      ?rs   )r&   r   r   r   r   r      r   r   r   r   r   r   r   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 truer   r   N)
r   r   r   rC   rT   rB   r
   r   r   r   )	rN   r   rE   r   rF   r   r   rG   r   r   r   r   r     s   0z.test_solve_discrete_are.<locals>._test_factoryr!   r!   )r   r   )r   r   r   )r   r   r   r   )r2   r7   gffffffi)r   rS   r:   Zkronr   r   r   Ztriur9   rT   Z	full_liker;   r   r   )	rL   r   r   r   rN   rl   rm   rn   ro   r   r   r   test_solve_discrete_are6  s  










"


	

	  Hr   c                  C   s  t g dg dg dgt ddgddgdd	ggt d
t dt g dg dg dgt dd ft g dg dg dgt ddgddgdd	ggt d
t dt g dg dg dgt dd fg} d}dd }t| D ]\}}||||  qvd S )Ng? ??g[,Y?g7h?g;)ƣ?g7j*0	<?gɚ&ꢡ?gڠݸ?g*[K?gfSdc?6Wtk?]p?;?/LX?	Gr?m!#{?r!   r    gGY?g X.e?g6u?g?gp?gv?g<d&?g?g2?r8   )r$   r$   c                 S   s   | \}}}}}}}|rt j|d t||||||}	| j|	|| j|	| | }
| j|	|| }|
|tt|| j8 }
t	|
t
|
|d dS r   )r   r   r   rC   rT   rB   r
   r   r   r   r   )rN   r   rE   r   rF   r   esr   rG   r   r   r   r   r   r   =  s   0 z<test_solve_generalized_continuous_are.<locals>._test_factory)r   rS   r:   r   r9   r   )rL   r   r   r   rN   r   r   r   %test_solve_generalized_continuous_are  sP   





r   c                  C   s4  t d} tg dg dg dgtddgddgd	d
ggtdtdtg dg dg dgtdd ftg dg dg dgtddgddgd	d
ggtdtdtg dg dg dgtdd f| d | d | d | d d | d d fg}d}dd }t|D ]\}}||||  qd S )Nzgendare_20170120_data.npzr   r   r   r   r   r   r   r   r   r!   r    r   r   r   r8   rl   rm   rn   ro   S)r%   r%   r   c              
   S   s  | \}}}}}}}|rt j|d t||||||}	|du r&t|jd }|du r/t|}| j	|		|| j	|		| | }
|
| j	|		|| 	t
|| j	|		| | j	|		|| j 8 }
t|
t|
|d dS )r   r   Nr   r   )r   r   r   r   r:   shaper   rC   rT   rB   r
   r   )rN   r   rE   r   rF   r   r   r   r   rG   r   r   r   r   r   z  s   
0z:test_solve_generalized_discrete_are.<locals>._test_factory)r   r   rS   r:   r   r9   r   )Zmat20170120rL   r   r   r   rN   r   r   r   #test_solve_generalized_discrete_areM  sb   





(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 ]'}tt|| ddd tt|||| d tt|||||  tt||||||  qd S )Nr8   r!   r   r   r9   r:   r   r   r;   r<   r>   r?   rG   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 ];}tt||| dd tt|||||||  tt|||t d| tt||||t d tt|||||t d qd S )Nr8   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reshaper:   r   r   r;   r<   )ZnsymZsymrG   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   mBrr   r   r!   )r   fullr:   r   r   r;   r<   )Zsingr?   rG   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 ];}tt|| ||| tt||| || tt|||| | tt|||||  tt||||||  tt|||||||  qd S )Nrr   r    )r   r   nanr:   r   r   r;   r<   )Znmr?   rG   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                   @   sT  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g dg dg dg dgeg dg dg dg dgeg dg dg dg d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g d#g d$g d%gedd&gddggeddgd&dgddggfeg d'g d$g d%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d0d1 Zd2S )3TestSolveSylvesterr   r    r   r"   r1   r3   r2   r#   r$   r%   r&   )r.   r   r   r   )r   r.   r(   rd   )r   r   r/   r   )r   r   r    r1   )r(   r   r   r.   )r   r.   rd   rd   )r   r   r.   r7   )r   r   r   r   )r   r.   r   r   )r   r   r.   r   )r   r   r   r.   r'   r(   r)   r*   r0   r   r/   rW   r+   r,   r-   r.   )r2   r   r3   )r!   r1   r4   )r"   r#   r    r!   )r2   r   y      @       @y      @      y              @y              @y      @      @c                 C   s.   t |||}tt||t|| | d S rA   )r   r   r   rB   r=   rE   r   crG   r   r   r   
check_case  s   "zTestSolveSylvester.check_casec                 C   s*   | j D ]}| |d |d |d  qd S )Nr   r   r    )rL   r   rM   r   r   r   rO     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.   rd   r(   r7   r   )r   rS   r   r   r   r   r   r   r   test_trivial  s
    zTestSolveSylvester.test_trivialN)	rP   rQ   rR   r   rS   rL   r   rO   r   r   r   r   r   r     sb    


-r   )r   Znumpyr   Znumpy.testingr   r   r   r;   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