o
    gby                     @   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   ]/home/ubuntu/cloudmapper/venv/lib/python3.10/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"      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   directrI   bilinear)casesrH   rK   r=   caser   r   r   
test_casesi   s   
zTestSolveLyapunov.test_casesrA   )__name__
__module____qualname__r   arrayr:   r   TrN   r@   rH   rK   rQ   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?)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   r/   )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   )r7   rz   r   r   )r   r   rs   r   )r   r   r7   rs   )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decimalN)pytestxfailr   rB   rC   rV   r
   r   
atleast_2dr   
zeros_like)
rP   decrE   brF   rknownfailurerG   resout_factr   r   r   _test_factory&  s   
 z0test_solve_continuous_are.<locals>._test_factory)r   r   diagrU   r	   r:   rV   r9   rB   rot90zerosflipud	enumerate)
mat6mat15mat18mat19mat20rN   min_decimalr   indrP   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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 }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"   rW   rX   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?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.   r0   r0   r0   )rf   r.   r0   r0   )rf   rf   r.   r0   )rf   rf   rf   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   r|   )r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r7   r   )r   r   r   r7   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   r4   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    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   rV   rB   r
   r   r   r   )	rP   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   rU   r:   kronr   r   r   triur9   rV   	full_liker;   r   r   )	rN   r   r   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 ]\}}||||  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   rV   rB   r
   r   r   r   r   )rP   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   rU   r:   r   r9   r   )rN   r   r   r   rP   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   rn   ro   rp   rq   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   rV   rB   r
   r   )rP   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   rU   r:   r   r9   r   )mat20170120rN   r   r   r   rP   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   arangereshaper:   r   r   r;   r<   )nsym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   mBrt   r   r!   )r   fullr:   r   r   r;   r<   )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 )Nrt   r    )r   r   nanr:   r   r   r;   r<   )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(   rf   )r   r   r/   r   )r   r   r    r1   )r(   r   r   r.   )r   r.   rf   rf   )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/   rY   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    )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(   r7   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     sb    


-r   )r   numpyr   numpy.testingr   r   r   r;   scipy.linalgr   r   r   r   r   r	   r
   r   scipy.sparse._sputilsr   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s(    W F f2D1