B
    `*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eZdd Zdd Zdd Zdd Zdd ZG dd de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   sB   t jt jt jtd| }t|}t|	 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   N/home/dcms/DCMS/lib/python3.7/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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            	   
         y      ?      ?g       @y      @      g      @y       @       y       @       @y            g      ?g      @g               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)r0   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)methodg      )r   r   r   r4   r5   r6   )r0   r7   r8   r;   r9   r   r   r   check_discrete_cased   s    z%TestSolveLyapunov.check_discrete_casec             C   sl   xf| j D ]\}| |d |d  | |d |d  | j|d |d dd | j|d |d dd qW d S )Nr   r   direct)r;   Zbilinear)casesr:   r<   )r0   caser   r   r   
test_casesi   s
    zTestSolveLyapunov.test_cases)N)__name__
__module____qualname__r   arrayr-   r   Tr>   r3   r:   r<   r@   r   r   r   r   r      sl   ((





















(
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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 }x$t|D ]\}}	||	||  q>W d S )Nzcarex_6_data.npzzcarex_15_data.npzzcarex_18_data.npzzcarex_19_data.npzzcarex_20_data.npzg      ?r   r   g       @r"   r!   g      g      r+   r#   r)   g      @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=
@g      @g
ףp=
gRQgffffffg(\g(\
g(\g{GzgGzgMbP?g        g      ?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@g{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'  g    .Ag  ?ig    ZAg    >Ag       g    `VAg    >g    SAzBad Residual Accuracyg?gGz?g    g    ag    Ag    .gư)r"   r   )r"   r"   @   )k)>   rN   )      )   r&      rQ   r%   r)   Nr'   r*   rQ   rQ   Nr#   rQ   rR   rQ   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   r4   r5   rE   r
   r   
atleast_2dr   
zeros_like)
r?   decr7   br8   rknownfailurer9   resout_factr   r   r   _test_factory&  s    
 z0test_solve_continuous_are.<locals>._test_factory)r   r   diagrD   r	   r-   rE   r,   r4   Zrot90zerosflipud	enumerate)
Zmat6Zmat15Zmat18Zmat19Zmat20r>   min_decimalr_   indr?   r   r   r   test_solve_continuous_areq   s   

 

"&



F
rf   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d ft dddgdddgddd'ggd t d	dt d	 dt d	 d f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 }x$t| D ]\}}||||  qW t t d}d|d< t dddgdddggj	}t 
|dt dddg }t dd/g}ttt|||| d S (   Nr    y      ?       r   y             r   r+   y              y              ?r!   y      ?      ?y      ?      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"   g      g      r#   r)   g ~:p?g2w-!?g5^I@gx&1gZd;O@g{Gzt?g{Gz?gUUUUUU?r*   gF]tE?gV-?gx&?gx&g/$?g/$ÿgF%uk?g?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?g{Gz?g333333ggg>Qg      ?g333333?g?gG)3@g        g?g {\f@ggR@g      r'   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
F)rM   gMbP?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   g    .A   r$   rR   igqq?gG?g:0yE>g      ?rJ   )r&   rQ   rR   rQ   rR   rj      rQ   rQ   rR   rQ   rR   rR   rQ   r&   r    r'   r)   r$   c       	   
   S   s   | \}}}}}|rt j|d t||||}| j||| | }|| j||t|| j|| | j||8 }t|t	||d dS )z5Checks if X = A'XA-(A'XB)(R+B'XB)^-1(B'XA)+Q) is true)rS   )rT   N)
rU   rV   r   r5   rE   r4   r
   r   r   rX   )	r?   rY   r7   rZ   r8   r[   r\   r9   r]   r   r   r   r_     s    6z.test_solve_discrete_are.<locals>._test_factory)r!   r!   )r   r   r(   gffffffi)r   rD   r-   Zkronr`   rb   rc   Ztriur,   rE   Z	full_liker.   r   r   )	r>   rd   r_   re   r?   rF   rG   rH   rI   r   r   r   test_solve_discrete_are6  sL   
















"

rm   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 }x$t| D ]\}}||||  qW d S )Ng? ??g[,Y?g7h?g;)ƣ?g7j*0	<?gɚ&ꢡ?gڠݸ?g*[K?gfSdc?g6Wtk?g]p?g;?g/LX?g	Gr?gm!#{?r!   r    gGY?g X.e?g6u?g?gp?gv?g<d&?g?g2?)r!   r    )r$   r$   c             S   s   | \}}}}}}}|r"t j|d t||||||}	| j|	|| j|	| | }
| j|	|| }|
|tt|| j8 }
t	|
t
|
|d dS )z5Checks if X = A'XA-(A'XB)(R+B'XB)^-1(B'XA)+Q) is true)rS   )rT   N)rU   rV   r   r5   rE   r4   r
   r   rW   r   rX   )r?   rY   r7   rZ   r8   r[   esr\   r9   r]   r^   r   r   r   r_   =  s    0 z<test_solve_generalized_continuous_are.<locals>._test_factory)r   rD   r-   ra   r,   rc   )r>   rd   r_   re   r?   r   r   r   %test_solve_generalized_continuous_are  s<    



rp   c              C   sR  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$ }x$t|D ]\}}||||  q2W d S )%Nzgendare_20170120_data.npzg? ??g[,Y?g7h?g;)ƣ?g7j*0	<?gɚ&ꢡ?gڠݸ?g*[K?gfSdc?g6Wtk?g]p?g;?g/LX?g	Gr?gm!#{?r!   r    gGY?g X.e?g6u?g?gp?gv?g<d&?g?g2?)r!   r    rF   rG   rH   rI   S)r%   r%   rj   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 )z5Checks if X = A'XA-(A'XB)(R+B'XB)^-1(B'XA)+Q) is true)rS   Nr   )rT   )rU   rV   r   r   r-   shaperX   r5   rE   r4   r
   r   )r?   rY   r7   rZ   r8   r[   rn   ro   r\   r9   r]   r   r   r   r_   z  s    
0&z:test_solve_generalized_discrete_are.<locals>._test_factory)r   r   rD   r-   ra   r,   rc   )Zmat20170120r>   rd   r_   re   r?   r   r   r   #test_solve_generalized_discrete_areM  sL    



rs   c              C   s,   dd } dd }dd }dd }d	d
 }d S )Nc           	   S   st   t d} t d}xZttfD ]N}tt|| ddd tt|||| d tt|||||  tt||||||  qW d S )N)r!   r    r!   r   )r   r,   r-   r   r   r.   r/   )r1   r2   r9   r   r   r   test_square_shape  s    

z1test_are_validate_args.<locals>.test_square_shapec              S   s   t d} t d}xttfD ]v}tt||| dd tt|||||||  tt|||t d| tt||||t d tt|||||t d qW d S )N)r!   r    r"   r   r!   )r   r,   r-   r   r   r.   r/   )r1   r2   r9   r   r   r   test_compatible_sizes  s    

z5test_are_validate_args.<locals>.test_compatible_sizesc              S   sV   t ddd} t d}x4ttfD ](}tt|||| | tt|||||  q&W d S )Nr#   r!   )r   Zarangereshaper-   r   r   r.   r/   )Znsymsymr9   r   r   r   test_symmetry  s
    
z-test_are_validate_args.<locals>.test_symmetryc           	   S   sb   t dd} | d  d8  < t d}x$ttfD ]}tt||||||  q0W ttt||||  d S )N)r!   r!   g   mB)r    r    r   r!   )r   fullr-   r   r   r.   r/   )Zsingr2   r9   r   r   r   test_singularity  s    
z0test_are_validate_args.<locals>.test_singularityc           
   S   s   t dt j} t d}xttfD ]v}tt|| ||| tt||| || tt|||| | tt|||||  tt||||||  tt|||||||  q"W d S )N)r    r    r    )r   ry   nanr-   r   r   r.   r/   )nmr2   r9   r   r   r   test_finiteness  s    
z/test_are_validate_args.<locals>.test_finitenessr   )rt   ru   rx   rz   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"   r'   r)   r(   r#   r$   r%   r&   g      ?g       @g        g      @rg   r+   y      ?      ?y      @      g      @g      y               @g      @y       @       y       @       @y            r!   r*   y              ?y      @       @y      @      y              @y              @y      @      @c             C   s.   t |||}tt||t|| | d S )N)r   r   r   r4   )r0   r7   rZ   cr9   r   r   r   
check_case  s    zTestSolveSylvester.check_casec             C   s.   x(| j D ]}| |d |d |d  qW d S )Nr   r   r    )r>   r   )r0   r?   r   r   r   r@     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 )Ng      ?g        g       @r+   r   )r   rD   rv   r   r   )r0   r7   rZ   r   r9   r   r   r   test_trivial  s
    zTestSolveSylvester.test_trivialN)	rA   rB   rC   r   rD   r>   r   r@   r   r   r   r   r   r     sH   





   r   )r   numpyr   Znumpy.testingr   rU   r   r.   Zscipy.linalgr   r   r   r   r   r	   r
   r   Zscipy.sparse.sputilsr   r   objectr   rf   rm   rp   rs   r~   r   r   r   r   r   <module>   s&   W F f2D1