o
    Ö­jŸ„  ã                   @   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 eeejeejgZd	d
„ ZG dd„ dƒZG dd„ dƒZG d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 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   ú\/var/www/html/CropPilot/venv/lib/python3.10/site-packages/scipy/linalg/tests/test_solvers.pyÚ
_load_data   s   ÿ
$ÿr   c                   @   s  e Zd Ze d¡e d¡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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d9d1d2„Zd3d4„ Zej d5e¡ej d6e¡d7d8„ ƒƒZd0S ):ÚTestSolveLyapunov©r   r   é   é   é   é   é	   é
   é   é   ù      ð?      ð?ç       @ù      @      Àç      @ù       @       Àù       @       @ù      ð¿      ð¿ç      ð?ç      @ç      ð¿)r#   r%   é   r!   r$   )r!   r"   r#   é   r$   )r$   é   r5   r5   r#   )r!   r3   r"   r   é   )r3   r#   r#   r!   r3   )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š™™™™™¹?        y²�ï§ÆK·?        yË¡E¶óý´?        yã¥›Ä °²?        yü©ñÒMb°?        y)\�Âõ(¬?        yZd;ßO�§?        y‹lçû©ñ¢?        yyé&1¬œ?        yÛù~j¼t“?        y{®Gáz„?        )ù      ð?        ù                r8   r8   r8   r8   r8   r8   r8   r8   r8   )r8   r7   r8   r8   r8   r8   r8   r8   r8   r8   r8   )r8   r8   r7   r8   r8   r8   r8   r8   r8   r8   r8   )r8   r8   r8   r7   r8   r8   r8   r8   r8   r8   r8   )r8   r8   r8   r8   r7   r8   r8   r8   r8   r8   r8   )r8   r8   r8   r8   r8   r7   r8   r8   r8   r8   r8   )r8   r8   r8   r8   r8   r8   r7   r8   r8   r8   r8   )r8   r8   r8   r8   r8   r8   r8   r7   r8   r8   r8   )r8   r8   r8   r8   r8   r8   r8   r8   r7   r8   r8   )r8   r8   r8   r8   r8   r8   r8   r8   r8   r7   r8   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_shape_   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_casef   s   
 ÿz'TestSolveLyapunov.check_continuous_caseNc                 C   s<   t |||d�}tt t ||¡| ¡  ¡ ¡| d| ƒ d S )N©Úmethodr2   )r   r   r   rD   rE   rF   )r?   rG   rH   rL   rI   r   r   r   Úcheck_discrete_casek   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!   ÚdirectrK   Úbilinear)ÚcasesrJ   rM   ©r?   Úcaser   r   r   Ú
test_casesp   s   
üzTestSolveLyapunov.test_casesÚdtype_aÚdtype_qc                 C   s†   t j d¡}t jd|d�}t jd|d�}t||ƒ}| d¡d  |¡}| d¡d  |¡}t||ƒ}|jdks9J ‚|j|jksAJ ‚d S )Ni[¯ûr    ©Údtype©r3   r3   éd   )r   ÚrandomÚdefault_rngÚzerosr   ÚastypeÚshaperW   )r?   rT   rU   ÚrngrG   rH   ÚresÚrefr   r   r   Útest_size_0w   s   

zTestSolveLyapunov.test_size_0rC   )Ú__name__Ú
__module__Ú__qualname__r   ÚemptyÚarrayr<   r   ÚTrP   rB   rJ   rM   rS   ÚpytestÚmarkÚparametrizeÚdtypesrb   r   r   r   r   r      sf    ÿÿÿÿÿÿÿþ
â!ß#ÿ"ÿÅ?
r   c                   @   sŽ  e Zd ZedƒZedƒZedƒZedƒZedƒZe	 
dgd¡e	 dgdgg¡edd	ƒdd
fe	 ddgddgg¡e	 dgdgg¡e	 ddgddgg¡dd
fe	 g d¢g d¢g d¢g d¢g¡e	 ddgddgddgddgg¡e	 g d¢g d¢g d¢g d¢g¡e	 d ¡d
fe	 g d!¢g d"¢g d#¢g d$¢g d%¢g d&¢g d'¢g d(¢g¡e	 g d)¢g d*¢g¡jd+ e	 g d,¢g d-¢g d.¢g d/¢g d0¢g d1¢g d2¢g d3¢g¡e	 d ¡d
fe	 g d4¢g d5¢g d6¢g d7¢g d8¢g d9¢g d:¢g d;¢g d<¢g	¡e	 g d=¢g d>¢g d?¢g d@¢g dA¢g dB¢g dB¢g dB¢g dB¢g	¡e	 d¡e	 d¡d
fedC edD edE edF d
fe	 ddgddGgg¡e	 dHgdgg¡e	 dI¡ddJfedKdLƒe	 dMdNgd+dOgg¡e	 dPdQgdQdRgg¡e	 dI¡edHdƒ d
fe	 ddSgddgg¡e	 dgdgg¡e	 d ¡dd
fe	 dTdgddTgg¡e	 d ¡e	 d ¡e	 d ¡d
fe	 ddgdd gg¡e	 dgdgg¡e	 dUdVgdVdGgg¡dd
fe	 g dW¢g dX¢g dY¢g¡d e	 d¡e	 g dZ¢g d[¢g d\¢g¡ e	 
g d]¢¡¡ e	 g dZ¢g d[¢g d\¢g¡¡d e	 d¡dS d^fe	 g d_¢g d`¢g da¢g db¢g¡e	 g dc¢g¡je	 
g dd¢¡dd
fe	 g de¢g df¢g dg¢g dh¢g¡e	 di¡e	 dj¡dd
fedC edD edE edF d
fe	jdkdkddl�e	 dkdk¡dG  e	 ede	 dm¡dƒ¡ e	jdkdkddl� e	 dk¡e	 dk¡e	 dk¡d
fe	 
e	 dn¡d¡e	 e	 dod¡¡e	 dod¡e	 dod¡j dd^fedC edD edE edF d
fedC edD edE edF d^fedC edD edE edF d^fgZdpZej dqeeƒ¡drds„ ƒZd
S )tÚTestSolveContinuousArezcarex_6_data.npzzcarex_15_data.npzzcarex_18_data.npzzcarex_19_data.npzzcarex_20_data.npzr0   r!   r   r*   Nr$   r#   ç      Àç      Àr9   r%   r5   ç      @©r   r!   r   r   )r   g=
×£p=þ¿gö(\�ÂõØ?g…ëQ¸À)r   gœÄ °rh¡¿g×£p=
×Àgq=
×£p@)gœÄ °rh¡?g/n£¼R¿g®Gáz®ï¿gáz®GáÊ¿g
×£p=
×?gš™™™™™ù¿gffffffî¿gü©ñÒMb ¿g¸…ëQ¸ž?)g/Ý$�@ç7‰A`åÐ@çj¼t“æ?çZd;ßO�—?)rr   g/Ý$�@ç‘í|?5^ò?çyé&1¬Ô?)rs   ru   gÕxé&1Ô?çé&1¬º?)rt   rv   rw   gsh‘í|?µ?r"   )gƒÀÊ¡E¶ï¿g!°rh‘íà?r   r   r   r   r   r   )çNbX9´à?g7‰A`åÐð¿çßO�—nã?r   r   r   r   r   )r   rx   gÙÎ÷Sãñ¿ry   r   r   r   r   )r   r   rx   gøSã¥›Äø¿g`åÐ"Ûùæ?r   r   r   )r   r   r   ç/Ý$�í?g=
×£p=ú¿gÅ °rh‘é?r   r   )r   r   r   r   rz   gð§ÆK7‰û¿g¢E¶óýÔì?r   )r   r   r   r   r   rz   g^ºI+ý¿g¼t“Vð?)r   r   r   r   r   r   rz   gJ+‡ÿ¿)g¸…ëQ¸@rp   gÍÌÌÌÌÌB@ç¤p=
×£@gáz®Gá@g
×£p=
@r{   r1   )g
×£p=
ÀgR¸…ëQÀgffffffÀg�Âõ(\�Àg�Âõ(\�
Àg�Âõ(\�Àg{®GázÀg®Gáz®Àçü©ñÒMbP?)r0   ç        r}   r}   ç      à?r}   r}   çš™™™™™¹?)r}   r0   r}   r}   r   r}   r}   r}   )r}   r}   r0   r}   r}   r~   r}   r}   )r}   r}   r}   r0   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}   r}   r   r}   )r   r}   r}   r}   r}   r}   r}   r   )	gú~j¼tÀg{®Gáz@r}   r}   g-²�ï§ Àr}   r}   r}   g×£p=
×ë?)	g¾Ÿ/Ý$Ö¿gZd;ßO�ï?r}   r}   g¸…ëQ¸Àr}   r}   r}   g
×£p=
ï?)	g‰A`åÐ¢ÀgªñÒMbÐ.@g-²�ï§FÀr}   gÍÌÌÌÌÌÀr}   r}   r}   gq=
×£p@)	g7‰A`åÐ5Àg!°rh‘ÍA@gV-²Õ¿gö(\�ÂõÀgÍÌÌÌÌÌ1Àr}   r}   r}   g�Âõ(\�@)	g+‡NÀgyé&1ŒX@gTã¥›Ä ÀgÃõ(\�ÂÕ?g/Ý$�JÀr}   r}   r}   gffffff4@)	r   r   r   r   ç     €W@çffffffbÀr}   gš™™™™™J@r}   )	r   r   r   r   r   r€   r�   r   r   )	r   r   r   r   r   çš™™™™™)@r}   çš™™™™™?Àr   )	r   r   r   r   r‚   r}   r}   gÍÌÌÌÌÌ2@rƒ   )ç{®Gáz„?gºI+‡†¿g‡ÙÎ÷SÃ¿)gú~j¼t“h?g/Ý$�•¿r}   )g;ßO�—n‚?gh‘í|?5®¿r}   )gú~j¼t“˜?g#Ûù~j¼Ä¿r}   )gœÄ °rh±?g{®GázÜ¿r}   )r}   r}   r}   ÚAÚBÚQÚRç       Àç�íµ ÷Æ°>©r"   r"   zBad residual accuracygš™™™™™¹¿g{®Gáz”¿r   r}   r„   rY   iè  i'  ç    €„.Ag›ò×  ð?iõÿÿÿéûÿÿÿ)g    ð³ZAç    €„>Ag       €)rŽ   g    `ãVAç    €„>Á)r}   r�   g    ÐSA)r0   r‰   r‰   )r‰   r0   r‰   )r‰   r‰   r0   )rŠ   r!   rŒ   zBad Residual Accuracy)r   gš™™™™™Ù?r   r   )r   r   g®GázÖ?r   )r   g    €ûÁg     aÁg    €ûA)r   r   r   g    €„.Á)r   r   r   rŒ   )r!   r   r!   r   )ç�íµ ÷Æ°¾r!   r   r   )r9   r�   r   r   )r   r   rŠ   r!   )r   r   r9   rŠ   )r$   r!   )r$   r$   é@   ©Úk)é>   r”   )é   é   )é   r(   é   r—   r'   r5   Nr3   r6   r—   r—   Nr%   r—   r˜   r—   Nr(   NNúj, casec                 C   sŽ   |\}}}}}|rt j|d� | j| }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)ri   ÚxfailÚmin_decimalr   rE   rh   r   r   Ú
atleast_2dr   Ú
zeros_like)r?   ÚjrR   rG   ÚbrH   ÚrÚknownfailureÚdecrI   r`   Úout_factr   r   r   Útest_solve_continuous_are=  s   
z0TestSolveContinuousAre.test_solve_continuous_are)rc   rd   re   r   Úmat6Úmat15Úmat18Úmat19Úmat20r   Údiagrg   r
   r<   rh   r;   rD   Úrot90r\   ÚflipudrP   rŸ   ri   rj   rk   Ú	enumerater¨   r   r   r   r   rm   ˆ   sn   üü
ý 
ýö
ù
ÿþ
ùìøÿ

ø	ëüüüüü
þþÿÿþø

ýù
	ýù	"ÿÿûüÿÿ �Þ -rm   c                   @   sÄ  e Zd Ze ddgddgg¡e dgdgg¡e ddgddgg¡e dgg¡dfe ddgddgg¡e dgd	gg¡e ddgddgg¡e dgg¡d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¡e ddgdd
gg¡dfe g d¢g d¢g d¢g¡e dgdgdgg¡e d
¡e d¡dfe dd
gddgg¡e dgdgg¡e ddgddgg¡e dgg¡d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¡e d dgdd
gg¡dfe ddgddgg¡e dgdgg¡e ddgddgg¡e dgg¡d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¡d# e dd
gd
dgg¡dfe ddgddgg¡e dgdgg¡e ddgddgg¡e dgg¡dfe g d$¢g d%¢g d&¢g d'¢g¡e d(dgd)d*gd+d,gd-d)gg¡e g d.¢g d/¢g d0¢g d1¢g¡e d¡dfe g d2¢g d3¢g d4¢g d5¢g¡e d6d7gd8d9gd:d;gd<d=gg¡e d¡d> e d¡dfe g d?¢g d@¢g dA¢g dB¢g¡e g dC¢g dD¢g dE¢g dF¢g¡e g dG¢g dH¢g dI¢g dJ¢g¡e d¡dfe g dK¢g dL¢g dM¢g dN¢g dO¢g¡d> e dPdQgdRdSgdTdUgdVdWgdXdYgg¡d> e dZ¡e d¡dfe e d¡ejddgdd[�¡e e d¡e dgdgdgg¡¡e g d\¢g d\¢g d]¢g d^¢g d_¢g d]¢g¡e d
dgddgg¡dfd`e g da¢g db¢g dc¢g dd¢g de¢g df¢g dg¢g dh¢g di¢g	¡ e g dj¢g dk¢g dl¢g dm¢g dn¢g do¢g dp¢g dq¢g dr¢g	¡d` e g ds¢¡e d
¡dfe ddtgddgg¡e dgdgg¡e d¡e dgg¡dfe g du¢g dv¢g dw¢g¡dx e d
¡dte d
¡ dte d
¡ dfe g dy¢g dz¢g d{¢g d|¢g¡e d}gdgdgdgg¡e g d~¢¡e dgg¡dfejd€dd[�e e d€d¡¡e d€¡e dgg¡dfgZ	d�Z
d‚dƒ„ e
D ƒZd„ed…< ded†< d‡edˆ< ej d‰ee	ƒ¡dŠd‹„ ƒZdŒd�„ ZdS )ŽÚTestSolveDiscreteArer"   y      ð?       Àr   y       €      Àr!   Nr9   y       €       Àù              ð?r#   r)   y      ð?      ð¿ù               @)gÑX=X­Iä?gPÂŽ÷‘á?g¿'9Ô­fè?)gú»Ò�Ká?gõèhÚ2á?g¸N¯Ö�Z¶?)gSÒŠ�Ñ?gè½s Ò,ë?g^LŽ–^öÝ?g•=Sùèþî?gÃþ>%ßS¬?gˆåòFBé?r$   rn   ro   r%   r5   g ‘~û:pî?g2w-!ôì?g5^ºI‚@gÕxé&1ó¿gZd;ßO�@g{®Gázt?g{®Gáz”?gUUUUUUÕ?éüÿÿÿr6   gF]tÑE·?)çV-²�ïï?gôýÔxé&±?r   r   )gôýÔxé&±¿r¶   r   r   )r   r   r¶   g/Ý$�•Ã?)r   r   g/Ý$�•Ã¿r¶   gF%ušk?r   gÇº¸�ðF¿g{®Gáz¤?gŸ<,Ôšæ}?gÇº¸�ðf¿)gìQ¸…ëý?r   r   ç¬Zd;Ï¿)r   g+‡ÙÎç?ç=
×£p=Ê?r   )r   r¸   g+‡Ùâ?r   )r·   r   r   gøSã¥›Äð?)gP�—nƒï?gŒ/Úã…t´¿gúéä±«M?g[AÓ+£Q¿)g†åÏ·K¥?gHþ`à¹÷ï?g$ÑË(–[¢¿g°¯u©ú‰?)gYÝê9é}á¿g¦_"Þ:ÿ¦?g!å'Õ>Õ¿gCâKºÈ?)g”ö_˜L@geâX·¹¿g ‰°áé•í¿g+‡ÙÐ¿gÅ Tófn?g`[š¶ÚH?gQ‡nùH¶¿g	v÷–ã>gé}ãkÏ,ó¿gÒUW‘;¿g{ƒ/L¦Š	ÀgOšaþeRN?r„   )g333333ã¿gš™™™™™ÀgÍÌÌÌÌÌÀgÍ>�Qž™À)r0   g333333ã?gš™™™™™é?gÍèGÃ)3@)r}   r0   gÍÌÌÌÌÌü?g {ö\f@)r}   r}   r}   ggÖR@Úÿï¿)r0   r2   r2   r2   )r}   r0   r2   r2   )r}   r}   r0   r2   )r}   r}   r}   r0   )r"   r!   r#   r5   )r!   r"   r"   r3   )r#   r"   r5   r'   )r5   r3   r'   é   )g5^ºIÚW@gY†8ÖÅmÿ?g¾Á&S×?g&S£’:±?gÛù~j¼t“?)gé&1¬lD@gj¼t“¨D@g/Ý$�0@g�1w-!ß@geª`TR'ó?)gÉv¾Ÿo(@gú~j¼tS:@gP�—nB@g\�Âõ(Ü/@gj¼t“Ä(@)gmÅþ²{r@gžï§ÆK·)@g/Ý$�5;@gþÔxé&q5@g°rh‘í|D@)gNbX9´À?g ‰°áé•â?g      þ?g’\þCúí@gR¸…ë‘W@gñôJY†8¦?gðHPüˆ¿g›æ§èH@g$(~Œ¹ð¿g /Ý$@g
×£p=
Àg•eˆc]Ü@gffffffÀgx$(~ŒÝ?gƒ/L¦
Fí¿r3   r’   )r!   r!   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r!   r9   r   )r   r   r   r9   r!   r   r|   )	gÍÌÌÌÌ0‹@g     à`@g®Gáz.'@g]ÜFxà?g\�Âõ(œBÀg#J{ƒ/LÖ?r   g+‡ÙÎ÷@gåÐ"Ûùþ@)	g33333#S@g33333Œ@gq=
×£p)@g"ýöuàœá?g®GázDÀg£#¹ü‡ô×?r   g…ëQ¸@gåÐ"Ûùþ@)	gÍÌÌÌÌÌ_Àg     Xv@i1  gHáz®G÷?g33333³YÀg/Ý$�•ï?r   g33333³'@g¸…ëQ¸2@)	g     ¸vÀg33333Ïƒ@g
×£p=ºR@gÍÌÌÌÌäˆ@g     qÀgÓMbX9@r   g¸…ëQ¸?@g)\�ÂõhH@)	i@üÿÿgš™™™™·™@gÍÌÌÌÌ`ÀgÙÎ÷ScÀg{®GáÚQ@g;ßO�—n@r   gáz®G!U@gš™™™™y_@)	g33333Ã„Àg=
×£p=\@g)\�Âõ8VÀg¢E¶óýÔÀg®GázU@g333333+@r   gš™™™™	b@gffffffY@)	g33333£yÀiµ  g{®GáZKÀg+‡ÙÎ÷Àg�Âõ(\ŸP@g{®Gáú(@g¼–�z6»?g®GázþX@g{®GájQ@)	gÍÌÌÌÌ|fÀg33333Ûr@g®Gázî7Àg�Âõ(\�ð¿gìQ¸…KN@g)\�Âõ(6@r   gÍÌÌÌÌ¼j@g…ëQ¸ÅA@)	gš™™™™‘uÀg33333#‚@g{®GáúFÀgmçû©ñÒÿ¿gffffffZ@g\�Âõ(Ü3@r   g33333ck@gfffffæj@)g
×£p=
@g cîZB>â¿gìQ¸…ëTÀ)gTã¥›Ä ì?gd;ßO�Àg×£p=
×À)gƒÀÊ¡E¶÷?g=
×£p=*Àg�—nƒÀ!@)g‰A`åÐ"@gq=
×£�AÀgÍÌÌÌÌÌ8@)g®Gáz®$@g     0WÀg33333³P@)gZd;ßÏ@gìQ¸…ËNÀgìQ¸…+C@)g7‰A`åÐ@g
×£p=jBÀg
×£p=J4@)gð§ÆK7‰ÿ?g®Gáz/Àgsh‘í|¿@)gÉv¾Ÿ/@gHáz®G>Àgáz®Ga-@)	é2   r   r   r   rº   r   r   r   r   rŒ   )é   r&   éþÿÿÿ)r&   r˜   éøÿÿÿ)r¼   r½   r6   gÇqÇq¼?)gGœ¡úÿÿï?r   r   r   )r!   r   r   r   rq   )r   r   r!   r   g:Œ0âŽyE>)r   r   r   r!   g      Ð?rY   )r(   r—   r˜   r—   r˜   r»   é   r—   r—   r˜   r—   r˜   r˜   r—   r(   r"   r$   r5   r&   c                 C   s   g | ]	}d d|   ‘qS )g      ø?r&   r   )Ú.0Úindr   r   r   Ú
<listcomp>  s    zTestSolveDiscreteAre.<listcomp>gê-�™—Q=r'   é   g-Cëâ6*?r»   r™   c                 C   s¨   |\}}}}}|rt j|d� | j| }t||||ƒ}	| ¡ j}
|	| |	| }}| ¡ j| |	 | }|| ¡ j| t||
|  |
ƒ|  8 }t|t 	|¡|d� dS )ú5Checks if X = A'XA-(A'XB)(R+B'XB)^-1(B'XA)+Q) is truerš   ©ÚatolN)
ri   rž   Úmax_tolr	   rE   rh   r   r   r   r¡   )r?   r¢   rR   rG   r£   rH   r¤   r¥   rÅ   rI   ÚbHÚxaÚxbr`   r   r   r   Útest_solve_discrete_are"  s   

(z,TestSolveDiscreteAre.test_solve_discrete_arec                 C   sn   t  t  d¡¡}d|d< t  g d¢g d¢g¡j}t  |d¡t  g d¢¡ }t  dd	g¡}ttt	||||ƒ d S )
N©r#   r#   r9   )r   r!   )r!   r!   r   )r   r   r!   r¼   )r4   r9   gffffffþ¿iöÿÿÿr   )
r   Útriur;   rg   rh   Ú	full_liker®   r=   r   r   )r?   r…   r†   r‡   rˆ   r   r   r   Útest_infeasible8  s   z$TestSolveDiscreteAre.test_infeasible)rc   rd   re   r   rg   r<   Úkronr®   r°   rP   rŸ   rÆ   ri   rj   rk   r±   rÊ   rÎ   r   r   r   r   r²   L  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Ô?g¯fSdcÜ?ç6±ÀWtkØ?çÞ]ÂüpëÇ?çý;‘è?ç¯/ÈLXß?çÿ	‰Gré?çm!#û{„Ü?r#   r"   ©gGY¿™˜®ä?g X.eªÑ?g6¹ÎuÐÄ?©gåßÏ³æ?gÀpàÀå?g¡™Ì¢v¾?©g»<ç¸d&è?gª™µ�öä?gÂÀ‰2åß?r:   )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)ri   rž   r   rE   rh   rD   r   r   r    r   r¡   )rR   r¦   rG   r£   rH   r¤   ÚeÚsr¥   rI   r`   r§   r   r   r   Ú_test_factoryd  s   0 z<test_solve_generalized_continuous_are.<locals>._test_factory)r   rg   r<   r\   r;   r±   )rP   rŸ   rÞ   rÀ   rR   r   r   r   Ú%test_solve_generalized_continuous_areB  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 ]\}}|||| ƒ qŒd S )Nzgendare_20170120_data.npzrÐ   rÑ   rÒ   rÓ   rÔ   rÕ   rÖ   r×   rØ   r#   r"   rÙ   rÚ   rÛ   r:   r…   r†   r‡   rˆ   ÚS)çpé~°=rá   g…xÝD\8¹<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Ä   )ri   rž   r	   r   r<   r^   r¡   rE   rh   rD   r   r   )rR   rÅ   rG   r£   rH   r¤   rÜ   rÝ   r¥   rI   r`   r   r   r   rÞ   ¡  s   
0ÿÿz:test_solve_generalized_discrete_are.<locals>._test_factory)r   r   rg   r<   r\   r;   r±   )Úmat20170120rP   Úmax_atolrÞ   rÀ   rR   r   r   r   Ú#test_solve_generalized_discrete_aret  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 )Nr:   r#   r!   ©r   r;   r<   r   r	   r=   r>   ©r@   rA   rI   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 )Nr:   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ÚsymrI   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   Úfullr<   r   r	   r=   r>   )ÚsingrA   rI   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 )Nr‹   r"   )r   rî   Únanr<   r   r	   r=   r>   )ÚnmrA   rI   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¡e d¡e d¡fe d¡e d¡e d¡fe d¡e d¡e d¡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 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d0d1„ Zd2d3„ Zd4d5„ Z	e
j d6e¡e
j d7e¡e
j d8e¡e
j d9dd*g¡e
j d:dd*g¡d;d<„ ƒƒƒƒƒZd=S )>ÚTestSolveSylvesterr    r‹   )r   r"   )r"   r   r!   r"   r   r$   r3   r5   r4   r%   r&   r'   r(   )r0   r   r   r   )r   r0   r*   r}   )r   r   r1   rµ   )r   r   r"   r3   )r*   r   r   r0   )r   r0   r}   r}   )r   r   r0   r9   )r   r   r!   r!   )r   r0   r   r   )r   r   r0   r   )r   r   r   r0   r)   r*   r+   r,   r2   r´   r1   rp   r-   r.   r/   r0   )r4   r!   r5   )r#   r3   r6   )r$   r%   r"   r#   )r4   r³   y      @       @y      @      ð¿y              @y              @y      @      @c                 C   s.   t |||ƒ}tt ||¡t ||¡ |ƒ d S rC   )r   r   r   rD   ©r?   rG   r£   ÚcrI   r   r   r   Ú
check_case$  s   "zTestSolveSylvester.check_casec                 C   s*   | j D ]}|  |d |d |d ¡ qd S )Nr   r!   r"   )rP   rø   rQ   r   r   r   rS   (  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 )Nr0   r}   r*   r9   r!   )r   rg   rê   r   r   rö   r   r   r   Útest_trivial,  s
    zTestSolveSylvester.test_trivialrT   Údtype_brU   ÚmÚnc                 C   sÞ   ||  kr
dkrn nt  d¡ tj d¡}tj||f|d�}tj||f|d�}tj||f|d�}	t|||	ƒ}
| d¡d  |¡}| d¡d  |¡}| d¡d  |¡}	t|||	ƒ}|
j||fkseJ ‚|
j	|j	ksmJ ‚d S )	Nr   z6m = n != 0 is not a case that needs to be tested here.l   >¿& rV   rX   rY   )r5   r5   )r3   r5   )
ri   Úskipr   rZ   r[   r\   r   r]   r^   rW   )r?   rû   rü   rT   rú   rU   r_   rG   r£   rH   r`   ra   r   r   r   rb   6  s   
zTestSolveSylvester.test_size_0N)rc   rd   re   r   rf   rg   rP   rø   rS   rù   ri   rj   rk   rl   rb   r   r   r   r   rõ   ì  s†    þþþþ
ý
ý
ýøþþþþþþÎ7
rõ   )"r   Únumpyr   Únumpy.testingr   r   ri   r   r=   Úscipy.linalgr   r   r   r   r	   r
   r   r   Úscipy.sparse._sputilsr   ÚintÚfloatÚfloat32ÚcomplexÚ	complex64rl   r   r   rm   r²   rß   rä   rô   rõ   r   r   r   r   Ú<module>   s*    j E w2G1