a
    ReD{                     @   s   d dl Z d dlZd dlmZ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assert_allclose)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 sL0    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   S/var/www/sunrise/env/lib/python3.9/site-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#      r4   r4   r"   )r    r2   r!   r      )r2   r"   r"   r    r2   )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?        )      ?                        r7   r7   r7   r7   r7   r7   r7   r7   r7   )r7   r6   r7   r7   r7   r7   r7   r7   r7   r7   r7   )r7   r7   r6   r7   r7   r7   r7   r7   r7   r7   r7   )r7   r7   r7   r6   r7   r7   r7   r7   r7   r7   r7   )r7   r7   r7   r7   r6   r7   r7   r7   r7   r7   r7   )r7   r7   r7   r7   r7   r6   r7   r7   r7   r7   r7   )r7   r7   r7   r7   r7   r7   r6   r7   r7   r7   r7   )r7   r7   r7   r7   r7   r7   r7   r6   r7   r7   r7   )r7   r7   r7   r7   r7   r7   r7   r7   r6   r7   r7   )r7   r7   r7   r7   r7   r7   r7   r7   r7   r6   r7   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methodr1   )r   r   r   rC   rD   rE   )r>   rF   rG   rK   rH   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    directrJ   Zbilinear)casesrI   rL   r>   caser   r   r   
test_casesi   s
    
zTestSolveLyapunov.test_cases)N)__name__
__module____qualname__r   arrayr;   r   TrN   rA   rI   rL   rQ   r   r   r   r   r      sX   
!#"<
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 ]\}}	||	||  qxd 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"               r8   r$   r4         @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?)r[   g/$@|?5^?y&1?)r\   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   ra   gSrb   r   r   r   r   )r   r   ra   gS㥛g`"?r   r   r   )r   r   r   /$?g=
ףp=g rh?r   r   )r   r   r   r   rc   gK7gE?r   )r   r   r   r   r   rc   g^I+gtV?)r   r   r   r   r   r   rc   gJ+)gQ@rY   gB@p=
ף@gzG@g
ףp=
@rd   r0   )g
ףp=
gRQgffffffg(\g(\
g(\g{GzgGzMbP?)r/           rf   rf         ?rf   rf   皙?)rf   r/   rf   rf   rh   rf   rf   rf   )rf   rf   r/   rf   rf   rg   rf   rf   )rf   rf   rf   r/   rf   rf   rf   rf   )rg   rh   rf   rf   rh   rf   rf   rf   )rf   rf   rg   rf   rf   rh   rf   rf   )rf   rf   rf   rf   rf   rf   rh   rf   )rh   rf   rf   rf   rf   rf   rf   rh   )	g~jtg{Gz@rf   rf   g- rf   rf   rf   gףp=
?)	g/$ֿgZd;O?rf   rf   gQrf   rf   rf   g
ףp=
?)	gA`ТgMb.@g-Frf   grf   rf   rf   gq=
ףp@)	g7A`5g!rhA@gV-տg(\g1rf   rf   rf   g(\@)	g+Ngy&1X@gT㥛Ġg(\?g/$Jrf   rf   rf   gffffff4@)	r   r   r   r        W@ffffffbrf   gJ@rf   )	r   r   r   r   r   ri   rj   r   r   )	r   r   r   r   r   皙)@rf   皙?r   )	r   r   r   r   rk   rf   rf   g2@rl   ){Gz?gI+gSÿ)g~jth?g/$rf   )g;On?gh|?5rf   )g~jt?g#~jĿrf   )g rh?g{Gzܿrf   )rf   rf   rf   ABQR       ư>r!   r!   zBad residual accuracygg{Gzrh   rf   rm   d   i  i'      .Ag  ?i)g    ZA    >Ag       )rx   g    `VA    >)rf   ry   g    SA)r/   rr   rr   )rr   r/   rr   )rr   rr   r/   )rs   r    rv   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   rv   )r    r   r    r   )ưr    r   r   )r8   rz   r   r   )r   r   rs   r    )r   r   r8   rs   )r#   r    )r#   r#   @   k)>   r~   )      )   r'      r   r&   r4   Nr2   r5   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decimalN)pytestxfailr   rC   rD   rV   r   r   
atleast_2dr   
zeros_like)
rP   decrF   brG   rknownfailurerH   resout_factr   r   r   _test_factory&  s    
 z0test_solve_continuous_are.<locals>._test_factory)r   r   diagrU   r
   r;   rV   r:   rC   Zrot90zerosflipud	enumerate)
Zmat6Zmat15Zmat18Zmat19Zmat20rN   min_decimalr   indrP   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 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dtft g dug dvg dwgdx t d	dst d	 dst d	 dyft g dzg d{g d|g d}gt d~gdgdgdggt g dt dggd ft jdddZt t ddt dt dggd fg} d}dd |D }d|d< dd }t| D ]\}}||||  qt 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    r8   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#   rW   rX   r$   r4   g ~:p?g2w-!?g5^I@gx&1gZd;O@g{Gzt?g{Gz?gUUUUUU?r5   gF]tE?)V-?gx&?r   r   )gx&r   r   r   )r   r   r   g/$?)r   r   g/$ÿr   gF%uk?rh   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?rm   )g333333ggg>Q)r/   g333333?g?gG)3@)rf   r/   g?g {\f@)rf   rf   rf   ggR@)r/   r1   r1   r1   )rf   r/   r1   r1   )rf   rf   r/   r1   )rf   rf   rf   r/   )r!   r    r"   r4   )r    r!   r!   r2   )r"   r!   r4   r&   )r4   r2   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
Fr2   r|   )r    r    r   r   r   r   )r   r   r   r   r   r   )r   r   r   r    r8   r   )r   r   r   r8   r    r   re   )	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   rv   z*Presumed issue with OpenBLAS, see gh-16926)   r%   )r%   r   )r   r   r5   gqq?z!Issue with OpenBLAS, see gh-16926)gG?r   r   r   )r    r   r   r   rZ   )r   r   r    r   g:0yE>)r   r   r   r    g      ?ru   )r'   r   r   r   r   r      r   r   r   r   r   r   r   r'   r!   r2   r4   r%   c                 S   s   g | ]}d d|   qS )g      ?r%   r   ).0r   r   r   r   
<listcomp>      z+test_solve_discrete_are.<locals>.<listcomp>g-Q=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   atolN)
r   r   r	   rD   rV   rC   r   r   r   r   )	rP   r   rF   r   rG   r   r   rH   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   )r3   r8   gffffffi)r   rU   r;   Zkronr   r   r   Ztriur:   rV   Z	full_liker<   r   r   )
rN   r   Zmax_tolr   r   rP   rn   ro   rp   rq   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 ]\}}||||  qd 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?r9   )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   N)r   r   r   rD   rV   rC   r   r   r   r   r   )rP   r   rF   r   rG   r   esr   rH   r   r   r   r   r   r   D  s    0 z<test_solve_generalized_continuous_are.<locals>._test_factory)r   rU   r;   r   r:   r   )rN   r   r   r   rP   r   r   r   %test_solve_generalized_continuous_are"  sN    





r   c                  C   s6  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 ]\}}||||  qd S )Nzgendare_20170120_data.npzr   r   r   r   r   r   r   r   r   r"   r!   r   r   r   r9   rn   ro   rp   rq   S)p~=r   gxD\8<c              
   S   s  | \}}}}}}}|r"t j|d t||||||}	|du rLt|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   rD   rV   rC   r   r   )rP   r   rF   r   rG   r   r   r   r   rH   r   r   r   r   r     s    
0z:test_solve_generalized_discrete_are.<locals>._test_factory)r   r   rU   r;   r   r:   r   )Zmat20170120rN   Zmax_atolr   r   rP   r   r   r   #test_solve_generalized_discrete_areT  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 )Nr9   r"   r    r   r:   r;   r   r	   r<   r=   r?   r@   rH   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 )Nr9   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nsymsymrH   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   mBrt   r    r"   )r   fullr;   r   r	   r<   r=   )Zsingr@   rH   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 )Nrt   r!   )r   r   nanr;   r   r	   r<   r=   )nmr@   rH   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#   r2   r4   r3   r$   r%   r&   r'   )r/   r   r   r   )r   r/   r)   rf   )r   r   r0   r   )r   r   r!   r2   )r)   r   r   r/   )r   r/   rf   rf   )r   r   r/   r8   )r   r   r    r    )r   r/   r   r   )r   r   r/   r   )r   r   r   r/   r(   r)   r*   r+   r1   r   r0   rY   r,   r-   r.   r/   )r3   r    r4   )r"   r2   r5   )r#   r$   r!   r"   )r3   r   y      @       @y      @      y              @y              @y      @      @c                 C   s.   t |||}tt||t|| | d S rB   )r   r   r   rC   r>   rF   r   crH   r   r   r   
check_case  s    zTestSolveSylvester.check_casec                 C   s*   | j D ]}| |d |d |d  qd S )Nr   r    r!   )rN   r   rO   r   r   r   rQ     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/   rf   r)   r8   r    )r   rU   r   r   r   r   r   r   r   test_trivial  s
    zTestSolveSylvester.test_trivialN)	rR   rS   rT   r   rU   rN   r   rQ   r   r   r   r   r   r     s`   


-r   )r   numpyr   Znumpy.testingr   r   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 m2G1