
    bi&                     B   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	lmZ eeej0                  eej4                  gZd
 Z G d d      Z G d d      Z G d d      Z G d d      Z d Z!d Z"d Z# G d d      Z$y)    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)matrix)skip_xp_invalid_argc                 H   t         j                  j                  t         j                  j                  t         j                  j	                  t
                    d|       }t        j                  |      5 }t        |j                               cddd       S # 1 sw Y   yxY w)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fs      Z/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/scipy/linalg/tests/test_solvers.py
_load_datar       sg    
 ww||BGGOOBGGOOH,EF"D*H		 aAGGI  s   5BB!c                      e Zd Z ej                  d       ej                  d      f ej
                  ddgddgg       ej
                  ddgdd	gg      f ej
                  d
dgddgg       ej
                  ddgddgg      f ej
                  ddgddgg       ej
                  ddgddgg      f ej
                  d
dgddgg       ej
                  ddgddgg      f ej
                  g dg dg dg dg dg       ej
                  g dg dg dg dg dg      f ej
                  g dg dg d g d!g d"g d#g d$g d%g d&g d'g d(g       ej                  d      f ed)dgd*d+gg       ed)dg      j                   ed)dg      j                  j                  z  f ed)dgd*d+gg       ej
                   ed)dg      j                   ed)dg      j                  j                  z        fg	Z	d, Z
d- Zd4d/Zed0        Zej                   j#                  d1e      ej                   j#                  d2e      d3               Zy.)5TestSolveLyapunovr   r               	   
               ?      ?       @      @            @       @              @       @                  ?      @      )r&   r(      r$   r'   )r$   r%   r&      r'   )r'      r8   r8   r&   )r$   r6   r%   r      )r6   r&   r&   r$   r6   )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?        )      ?                        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;   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;   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;   r   g      c                    t        j                  d      }t        j                  d      }t        t        t
        ||       t        t        t
        ||       t        t        t
        |t        j                  d             y )Nr&   r%   r&   r%   )r   oneseyeassert_raises
ValueErrorr   )selfnsqsqs      r   $test_continuous_squareness_and_shapez6TestSolveLyapunov.test_continuous_squareness_and_shape`   sQ    ggfoVVAYj";S"Ej";REj";RK    c                     t        ||      }t        t        j                  ||      t        j                  ||j	                         j                               z   |       y N)r   r   r   dotconj	transpose)rC   aqxs       r   check_continuous_casez'TestSolveLyapunov.check_continuous_caseg   sE    %a+!&&A,16683E3E3G)HH!	MrG   Nc                     t        |||      }t        t        j                  t        j                  ||      |j	                         j                               |z
  d|z         y )Nmethodr5   )r   r   r   rJ   rK   rL   )rC   rM   rN   rS   rO   s        r   check_discrete_casez%TestSolveLyapunov.check_discrete_casel   sK    #Aq8!ffRVVAq\1668+=+=+?@1Dd1f	NrG   c                     | j                   D ]f  }| j                  |d   |d          | j                  |d   |d          | j                  |d   |d   d       | j                  |d   |d   d       h y )Nr   r$   directrR   bilinear)casesrP   rT   rC   cases     r   
test_caseszTestSolveLyapunov.test_casesq   s    JJ 	JD&&tAwQ8$$T!Wd1g6$$T!Wd1gh$G$$T!Wd1gj$I		JrG   dtype_adtype_qc                    t         j                  j                  d      }t        j                  d|      }t        j                  d|      }t	        ||      }|j                  d      dz  j                  |      }|j                  d      dz  j                  |      }t	        ||      }|j                  dk(  sJ |j                  |j                  k(  sJ y )Ni[r#   dtyper6   r6   d   )r   randomdefault_rngzerosr   astypeshaper`   )rC   r\   r]   rngrM   rN   resrefs           r   test_size_0zTestSolveLyapunov.test_size_0y   s     ii##I.HHV7+HHV7+'1-ZZ#++G4ZZ#++G4'1-yyF"""yyCII%%%rG   rI   )__name__
__module____qualname__r   emptyarrayr@   r   TrX   rF   rP   rT   r   r[   pytestmarkparametrizedtypesrk    rG   r   r"   r"      s    
&		&			Aq6Aq6"	#	Ar7RH%	&	( 
FC=8S/2	3	FF#gs^4	5	7 
C:Sz*	+	FF#gs^4	5	7 
FC=8S/2	3	C:c{+	,	. 
?O_"O5 
6	?O_"O5 
6	7
 
 =    
!B 
C!	F 
!Q$$	%
!Q.

VQF^--//
/	2 
!Q$$	%
"((61a&>##faVn&6&6&8&88
9	<w=
E~LM
N
 J J [[Y/[[Y/& 0 0&rG   r"   c                      e Zd Z ed      Z ed      Z ed      Z ed      Z ed      Z e	j                  dgd       e	j                  dgdgg       edd	      dd
f e	j                  ddgddgg       e	j                  dgdgg       e	j                  ddgddgg      dd
f e	j                  g dg dg dg dg       e	j                  ddgddgddgddgg       e	j                  g dg dg dg dg       e	j                  d       d
f e	j                  g d!g d"g d#g d$g d%g d&g d'g d(g       e	j                  g d)g d*g      j                  d+z   e	j                  g d,g d-g d.g d/g d0g d1g d2g d3g       e	j                  d       d
f e	j                  g d4g d5g d6g d7g d8g d9g d:g d;g d<g	       e	j                  g d=g d>g d?g d@g dAg dBg dBg dBg dBg	       e	j                  d       e	j                  d      d
fedC   edD   edE   edF   d
f e	j                  ddgddGgg       e	j                  dHgdgg       e	j                  dI      ddJf edKdL       e	j                  dMdNgd+dOgg       e	j                  dPdQgdQdRgg       e	j                  dI       edHd      z   d
f e	j                  ddSgddgg       e	j                  dgdgg       e	j                  d       dd
f e	j                  dTdgddTgg       e	j                  d        e	j                  d        e	j                  d       d
f e	j                  ddgdd gg       e	j                  dgdgg       e	j                  dUdVgdVdGgg      dd
f e	j                  g dWg dXg dYg      dz   e	j                  d       e	j                  g dZg d[g d\g      j!                   e	j                  g d]            j!                   e	j                  g dZg d[g d\g            dz   e	j                  d      dSz  d^f e	j                  g d_g d`g dag dbg       e	j                  g dcg      j                   e	j                  g dd      dd
f e	j                  g deg dfg dgg dhg       e	j                  di       e	j                  dj      dd
fedC   edD   edE   edF   d
f e	j                  dkdkdl       e	j                  dkdk      dGz  z    e	j"                   ed e	j$                  dm      d            z    e	j                  dkdkdl      z    e	j                  dk       e	j                  dk       e	j                  dk      d
f e	j                   e	j                  dn      d       e	j&                   e	j                  dod             e	j                  dod       e	j                  dod      j                  z  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.                  j1                  dq ee            dr        Zy
)sTestSolveContinuousArezcarex_6_data.npzzcarex_15_data.npzzcarex_18_data.npzzcarex_19_data.npzzcarex_20_data.npzr3   r$   r   r-   Nr'   r&               r<   r(   r8         @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   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   r   gK7gE?r   )r   r   r   r   r   r   g^I+gtV?)r   r   r   r   r   r   r   gJ+)gQ@r{   gB@p=
ף@gzG@g
ףp=
@r   r4   )g
ףp=
gRQgffffffg(\g(\
g(\g{GzgGzMbP?)r3           r   r         ?r   r   皙?)r   r3   r   r   r   r   r   r   )r   r   r3   r   r   r   r   r   )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   r   r   r   )r   r   r   r   r   r   r   r   )	g~jtg{Gz@r   r   g- r   r   r   gףp=
?)	g/$ֿgZd;O?r   r   gQr   r   r   g
ףp=
?)	gA`ТgMb.@g-Fr   gr   r   r   gq=
ףp@)	g7A`5g!rhA@gV-տg(\g1r   r   r   g(\@)	g+Ngy&1X@gT㥛Ġg(\?g/$Jr   r   r   gffffff4@)	r   r   r   r        W@ffffffbr   gJ@r   )	r   r   r   r   r   r   r   r   r   )	r   r   r   r   r   皙)@r   皙?r   )	r   r   r   r   r   r   r   g2@r   ){Gz?gI+gSÿ)g~jth?g/$r   )g;On?gh|?5r   )g~jt?g#~jĿr   )g rh?g{Gzܿr   )r   r   r   ABQR       ư>r%   r%   zBad residual accuracygg{Gzr   r   r   rb   i  i'      .Ag  ?i)g    ZA    >Ag       )r   g    `VA    >)r   r   g    SA)r3   r   r   )r   r3   r   )r   r   r3   )r   r$   r   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   r   )r$   r   r$   r   )ưr$   r   r   )r<   r   r   r   )r   r   r   r$   )r   r   r<   r   )r'   r$   )r'   r'   @   k)>   r   )      )   r+      r   r*   r8   Nr6   r9   r   r   Nr(   r   r   r   Nr+   NNj, casec                    |\  }}}}}|rt        j                  |       | j                  |   }t        ||||      }	|	|z  |j	                         j
                  |	z  z   |z   }
|	|z  }|
|t        t        j                  |      |j	                         j
                        z  z  }
t        |
t        j                  |
      |       y)z3Checks if 0 = XA + A'X - XB(R)^{-1} B'X + Q is truereasondecimalN)rr   xfailmin_decimalr	   rK   rq   r   r   
atleast_2dr   
zeros_like)rC   jrZ   rM   brN   rknownfailuredecrO   ri   out_facts               r   test_solve_continuous_arez0TestSolveContinuousAre.test_solve_continuous_are?  s     $( 1aLLL-q! Aq!,!eaffhjj1n$q(q5x%a 0(--/2C2CDDD!#r}}S'93GrG   )rl   rm   rn   r    mat6mat15mat18mat19mat20r   diagrp   r   r@   rq   r?   rJ   rot90re   flipudrX   r   rr   rs   rt   	enumerater   rv   rG   r   rx   rx      s*   ()D*+E*+E*+E*+E 
"q		A3*		B		
			 
Aq6D$<(	)	A3+		Aq6Ar7#	$	
			 
<*+13 
4 
Aq6D$<%4)D	E	////1 
2 
	
	 
488878846 
7 
DKM 
A
 
;;;;;;;;= 
> 
	)	, 
==BHH925>@	
A 
*))))((((* 
+ 
		+	. 
cDItCy$s)T:	Aq6As8$	%	D6A3-	 			 		" 
D%	 	E5>E5>2	3	C;u.	/	:dA.	.			 
As8aV$	%	A3+						 
Iq>B	?3	4						 
Ar7QF#	$	A3*		C9r3i(	)				 
,2,. 
/12
3 
	>>>B	C	G	G'
)),BHHnnnEF*HJK
L 
S	 	" 
>#3"$ 
% 
>"	#	%	%					 
#$"#% 
& 
				 
sU3ZsU3Z>	B"	r2 4	4xrxxAxrxx11587 
79?B!9L
M					 
!	$	6266"a=	!	AA	(	
	 		" 
sU3ZsU3Z>	sU3ZsU3Z	 	" 
sU3ZsU3Z	 	"Cc
EX>K [[Y	%(89H :HrG   rx   c                   z   e Zd Z ej                  ddgddgg       ej                  dgdgg       ej                  ddgddgg       ej                  dgg      df ej                  ddgddgg       ej                  dgd	gg       ej                  ddgddgg       ej                  dgg      df ej                  d
dgddgg       ej                  ddgdd
gg       ej                  ddgddgg       ej                  ddgdd
gg      df ej                  g dg dg dg       ej                  dgdgdgg       ej
                  d
       ej
                  d      df ej                  dd
gddgg       ej                  dgdgg       ej                  ddgddgg       ej                  dgg      df ej                  ddgddgg       ej                  ddgddgg       ej                  ddgddgg       ej                  d dgdd
gg      df ej                  ddgddgg       ej                  dgdgg       ej                  ddgddgg       ej                  dgg      df ej                  ddgddgg       ej                  ddgddgg       ej                  d!d!gd!d"gg      d#z   ej                  dd
gd
dgg      df ej                  ddgddgg       ej                  dgdgg       ej                  ddgddgg       ej                  dgg      df ej                  g d$g d%g d&g d'g       ej                  d(dgd)d*gd+d,gd-d)gg       ej                  g d.g d/g d0g d1g       ej
                  d      df ej                  g d2g d3g d4g d5g       ej                  d6d7gd8d9gd:d;gd<d=gg       ej
                  d      d>z   ej
                  d      df ej                  g d?g d@g dAg dBg       ej                  g dCg dDg dEg dFg       ej                  g dGg dHg dIg dJg       ej
                  d      df ej                  g dKg dLg dMg dNg dOg      d>z   ej                  dPdQgdRdSgdTdUgdVdWgdXdYgg      d>z   ej
                  dZ       ej
                  d      df ej                   ej
                  d       ej                  ddgd[             ej                   ej
                  d       ej                  dgdgdgg             ej                  g d\g d\g d]g d^g d_g d]g       ej                  d
dgddgg      dfd` ej                  g dag dbg dcg ddg deg dfg dgg dhg dig	      z   ej                  g djg dkg dlg dmg dng dog dpg dqg drg	      d`z   ej                  g ds       ej
                  d
      df ej                  ddtgddgg       ej                  dgdgg       ej
                  d       ej                  dgg      df ej                  g dug dvg dwg      dxz   ej
                  d
      dt ej
                  d
      z  dt ej
                  d
      z  df ej                  g dyg dzg d{g d|g       ej                  d}gdgdgdgg       ej                  g d~       ej                  dgg      df ej
                  dd[       ej                   ej
                  dd             ej
                  d       ej                  dgg      dfgZ	dZ
e
D  cg c]  }dd| z  z   c}} Zded<   ded<   ded<   ej                  j                  d ee	            d        Zd Zyc c}} w )TestSolveDiscreteArer%   y      ?       r   y             r$   Nr<   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'   ry   rz   r(   r8   g ~:p?g2w-!?g5^I@gx&1gZd;O@g{Gzt?g{Gz?gUUUUUU?r9   gF]tE?)V-?gx&?r   r   )gx&r   r   r   )r   r   r   g/$?)r   r   g/$ÿr   gF%uk?r   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?r   )g333333ggg>Q)r3   g333333?g?gG)3@)r   r3   g?g {\f@)r   r   r   ggR@)r3   r5   r5   r5   )r   r3   r5   r5   )r   r   r3   r5   )r   r   r   r3   )r%   r$   r&   r8   )r$   r%   r%   r6   )r&   r%   r8   r*   )r8   r6   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
Fr6   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   )	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   r   )   r)   )r)   r   )r   r   r9   gqq?)gG?r   r   r   )r$   r   r   r   r|   )r   r   r$   r   g:0yE>)r   r   r   r$         ?rb   )r+   r   r   r   r   r      r   r   r   r   r   r   r   r+   r%   r'   r8   r)   g      ?r)   g-Q=r*      g-C6*?r   r   c                    |\  }}}}}|rt        j                  |       | j                  |   }t        ||||      }	|j	                         j
                  }
|	|z  |	|z  }}|j	                         j
                  |z  |	z
  |z   }||j	                         j
                  |z  t        ||
|z  z   |
      |z  z  z  }t        |t        j                  |      |       y)5Checks if X = A'XA-(A'XB)(R+B'XB)^-1(B'XA)+Q) is truer   atolN)
rr   r   max_tolr
   rK   rq   r   r   r   r   )rC   r   rZ   rM   r   rN   r   r   r   rO   bHxaxbri   s                 r   test_solve_discrete_arez,TestSolveDiscreteAre.test_solve_discrete_are$  s     $( 1aLLL-||Aq!Q*VVXZZQABffhjj2o!A%qvvxzzB%BGR"82"=>> 	R]]3/d;rG   c                 b   t        j                  t        j                  d            }d|d<   t        j                  g dg dg      j                  }t        j
                  |d      t        j                  g d      z   }t        j                  dd	g      }t        t        t        ||||       y )
Nr&   r&   r<   )r   r$   )r$   r$   r   )r   r   r$   r   )r7   r<   gffffffir   )
r   triur?   rp   rq   	full_liker   rA   r   r	   )rC   r   r   r   r   s        r   test_infeasiblez$TestSolveDiscreteAre.test_infeasible:  s}    GGBGGFO$$HHi+,..LLB"''-"88GGS#Jk#7Aq!DrG   )rl   rm   rn   r   rp   r@   kronr   r   rX   r   r   rr   rs   rt   r   r   r   ).0inds   00r   r   r   N  s	     
At9q#h'	(	A3*		Aq6Aq6"	#	A3%			 
Aq6Ar7#	$	C52$-	 	Aq6Aq6"	#	A3%			 
Aq6Ar7#	$	Aq6Aq6"	#	At9tQi(	)	As8b!W%	&			 
7668 
9 
J<*
|<	=				 
Aq6D$<(	)	A3+		Aq6Aq6"	#	A3%			 
FA;F,	-	E5>GU#34	5	E1:4y)	*	C8aV$	%			 
Ar7QF#	$	A3*		Aq6Aq6"	#	A3%			 
Aq6Ar7#	$	Aq6Aq6"	#	B8b!W%	&$	/	Aq6Aq6"	#			 
Aq6Aq6"	#	A3*		Aq6Aq6"	#	A3%			 
'''') 
* 
FF#F#F#F#% 
& 
'''(* 
+ 
		 
====? 
@ 
Iy)y)z*y)+ 
, 
4		
	 
C??@B 
C 
*)(') 
* 
< !# 
$ 
		 
<>@?<	> 
? BF	
F
 
FG$G$G$G$G$	& 
' *.	
.
 
			 
GBGGQFa0	1	HBHHqcA3_5	6	%%%&&%' 
( 
Aq6Aq6"	#			 

F
F
D
G
G
H
J
H
H
J	K 	
K 
.--./..-.0 
1 49
9 
.	/		+	. 
As8aV$	%	A3*			A3%		 
< 
 #&
( 
	vrvvay	vrvvay	 
'  
! 
E7QC!qc*	+			D6(			 
q		6266#q>	"		A3%			q}
EN4K)45#sR#X~5GGBK GBK GBK[[Y	%(89< :<*EE 6s   (^7r   c                   T    e Zd Zej                  j                  deeg      d        Zy)TestSolveCommonAresolverc                    t        j                  ddgddgg      }t        j                  dgdgg      }t        j                  d      }t        j                  d      }t        j                  d      }t        j                  dgd	gg      } ||||||
      } |||||||      }	t         j                  j                  ||	       y )Ngr   r   ggq=
ףp?g?r%   r   g?)s)r   rp   r@   r   testingr   )
rC   r   r   r   r   r   ESri   rj   s
             r   (test_with_skipped_array_argument_gh23336z;TestSolveCommonAre.test_with_skipped_array_argument_gh23336E  s     HHtTlQI./HHtftf%&FF1IMM$FF1IHHsecU^$Q1a1%Q1aA&


""3,rG   N)	rl   rm   rn   rr   rs   rt   r	   r
   r   rv   rG   r   r   r   D  s-    [[X(<>P'QR- S-rG   r   c                     t        j                  g dg dg dg      t        j                  ddgddgdd	gg      t        j                  d
      t        j                  d      t        j                  g dg dg dg      t        j                  d      d ft        j                  g dg dg dg      t        j                  ddgddgdd	gg      t        j                  d
      t        j                  d      t        j                  g dg dg dg      t        j                  d      d fg} d}d }t        |       D ]  \  }} ||||           y )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?r>   )r)   r)   c                    | \  }}}}}}}|rt        j                  |       t        ||||||      }	|j                         j                  j                  |	j                  |            |j                         j                  j                  |	j                  |            z   |z   }
|j                         j                  j                  |	      j                  |      |z   }|
|j                  t        t        j                  |      |j                         j                              z  }
t        |
t        j                  |
      |       y)r   r   r   N)rr   r   r	   rK   rq   rJ   r   r   r   r   r   )rZ   r   rM   r   rN   r   er   r   rO   ri   r   s               r   _test_factoryz<test_solve_generalized_continuous_are.<locals>._test_factoryv  s    )-&1aAq,LL- Aq!Q2ffhjjnnQUU1X&a)AAAE668::>>!$((+a/x||E"--"2HMMO4E4EFGG!#r}}S'93GrG   )r   rp   r@   re   r?   r   )rX   r   r   r   rZ   s        r   %test_solve_generalized_continuous_arer   T  s^    
===? 
@ 
L,/ ,/ ,/1 
2 
		===? 
@ 
&			 
===? 
@ 
L,/ ,/ ,/1 
2 
		===? 
@ 
		!
E> K
H u% .	TdK,-.rG   c                     t        d      } t        j                  g dg dg dg      t        j                  ddgddgd	d
gg      t        j                  d      t        j                  d      t        j                  g dg dg dg      t        j                  d      d ft        j                  g dg dg dg      t        j                  ddgddgd	d
gg      t        j                  d      t        j                  d      t        j                  g dg dg dg      t        j
                  d      d f| d   | d   | d   | d   d | d   d fg}d}d }t        |      D ]  \  }} ||||           y )Nzgendare_20170120_data.npzr   r   r   r   r   r   r   r   r   r&   r%   r   r   r   r>   r   r   r   r   r   )p~=r   gxD\8<c                    | \  }}}}}}}|rt        j                  |       t        ||||||      }	|"t        j                  |j
                  d         }|t        j                  |      }|j                         j                  j                  |	j                  |            |j                         j                  j                  |	j                  |            z
  |z   }
|
|j                         j                  j                  |	j                  |            |z   j                  t        ||j                         j                  j                  |	j                  |            z   |j                         j                  j                  |	j                  |            |j                         j                  z               z  }
t        |
t        j                  |
      |       y)r   r   Nr   r   )rr   r   r
   r   r@   rg   r   rK   rq   rJ   r   r   )rZ   r   rM   r   rN   r   r   r   r   rO   ri   s              r   r   z:test_solve_generalized_discrete_are.<locals>._test_factory  sQ   )-&1aAq,LL-q!Q1a09qwwqz"A9a AffhjjnnQUU1X&a)AAAE

quuQx(1,11!AFFHJJNN155844668::>>!%%(3affhjj@ 	 	R]]3/d;rG   )r    r   rp   r@   re   r?   r   )mat20170120rX   max_atolr   r   rZ   s         r   #test_solve_generalized_discrete_arer     s   89K
 
===? 
@ 
L,/ ,/ ,/1 
2 
		===? 
@ 
&			 
===? 
@ 
L,/ ,/ ,/1 
2 
		===? 
@ 
		 
S		S		S		S			S			?&
EP +H<, u% +	TdHSM*+rG   c                  "    d } d }d }d }d }y )Nc            
         t        j                  d      } t        j                  d      }t        t        fD ]S  }t        t        || ddd       t        t        |||| d       t        t        |||||        t        t        ||||||        U y )Nr>   r&   r$   r   r?   r@   r	   r
   rA   rB   rD   rE   rO   s      r   test_square_shapez1test_are_validate_args.<locals>.test_square_shape  s{    ggfoVVAY&(:; 	>A*aaA6*aRa8*aRS9*aRR=		>rG   c                     t        j                  d      } t        j                  d      }t        t        fD ]  }t        t        ||| dd       t        t        |||||||        t        t        |||t        j                  d      |       t        t        ||||t        j                  d             t        t        |||||t        j                  d              y )Nr>   r'   r$   r&   r  r  s      r   test_compatible_sizesz5test_are_validate_args.<locals>.test_compatible_sizes  s    ggfoVVAY&(:; 	DA*aS!Q7*aRRSA*aRB?*aRRVVAY?*aRRC	DrG   c            	          t        j                  d      j                  dd      } t        j                  d      }t        t
        fD ]*  }t        t        |||| |       t        t        |||||        , y )Nr(   r&   )r   arangereshaper@   r	   r
   rA   rB   )nsymsymrO   s      r   test_symmetryz-test_are_validate_args.<locals>.test_symmetry  sb    yy|##Aq)ffQi&(:; 	>A*ac4=*ac3=	>rG   c            
          t        j                  dd      } | dxx   dz  cc<   t        j                  d      }t        t        fD ]  }t        t        ||||||         t        t        t        ||||        y )Nr   g   mBr   r$   r&   )r   fullr@   r	   r
   rA   rB   )singrE   rO   s      r   test_singularityz0test_are_validate_args.<locals>.test_singularity  sj    wwvt$T
a
VVAY&(:; 	?A*aRR>	? 	j"6BDIrG   c                     t        j                  dt         j                        } t        j                  d      }t        t
        fD ]}  }t        t        || |||       t        t        ||| ||       t        t        |||| |       t        t        |||||        t        t        ||||||        t        t        |||||||         y )Nr   r%   )r   r  nanr@   r	   r
   rA   rB   )nmrE   rO   s      r   test_finitenessz/test_are_validate_args.<locals>.test_finiteness  s    WWVRVV$VVAY&(:; 	AA*aRR8*aRR8*aRR8*aRR8*aRR<*aRRR@	ArG   rv   )r  r  r  r  r  s        r   test_are_validate_argsr    s    >D>J	ArG   c                   :   e Zd Z ej                  d       ej                  d       ej                  d      f ej                  d       ej                  d       ej                  d      f ej                  d       ej                  d       ej                  d      f ej
                  ddgddgg       ej
                  d	d
gddgg       ej
                  ddgddgg      f ej
                  g dg dg dg dg       ej
                  g dg dg dg dg       ej
                  g dg dg dg dg      f ej
                  ddgddgg       ej
                  dd gd!d"gg       ej
                  d#d$gd%dgg      f ej
                  d&dgd!dgg       ej
                  ddgd!d"gg       ej
                  d#d$gd%dgg      f ej
                  ddgddgg       ej
                  ddgd!d"gg       ej
                  d#d$gd%dgg      f ej
                  ddgddgg       ej
                  ddgd!d"gg       ej
                  ddgddgg      f ej
                  g d'g d(g d)g       ej
                  dd*gdd	gg       ej
                  ddgd*dgd	d
gg      f ej
                  g d+g d(g d)g       ej
                  dd*gdd,gg       ej
                  dd gd*d-gd.d/gg      fgZd0 Zd1 Zd2 Z	e
j                  j                  d3e      e
j                  j                  d4e      e
j                  j                  d5e      e
j                  j                  d6dd*g      e
j                  j                  d7dd*g      d8                                    Zy9):TestSolveSylvesterr#   r   )r   r%   )r%   r   r$   r%   r   r'   r6   r8   r7   r(   r)   r*   r+   )r3   r   r   r   )r   r3   r-   r   )r   r   r4   r   )r   r   r%   r6   )r-   r   r   r3   )r   r3   r   r   )r   r   r3   r<   )r   r   r$   r$   )r   r3   r   r   )r   r   r3   r   )r   r   r   r3   r,   r-   r.   r/   r5   r   r4   r{   r0   r1   r2   r3   )r7   r$   r8   )r&   r6   r9   )r'   r(   r%   r&   )r7   r   y      @       @y      @      y              @y              @y      @      @c                     t        |||      }t        t        j                  ||      t        j                  ||      z   |       y rI   )r   r   r   rJ   rC   rM   r   crO   s        r   
check_casezTestSolveSylvester.check_case6  s3    Aq!$!"&&A,1"=qArG   c                 ^    | j                   D ]  }| j                  |d   |d   |d            y )Nr   r$   r%   )rX   r  rY   s     r   r[   zTestSolveSylvester.test_cases:  s1    JJ 	7DOODGT!Wd1g6	7rG   c                 2   t        j                  ddgddgg      }t        j                  dgg      }t        j                  ddg      j                  dd      }t        |||      }t	        |t        j                  ddg      j                  dd             y )Nr3   r   r-   r<   r$   )r   rp   r  r   r   r  s        r   test_trivialzTestSolveSylvester.test_trivial>  s    HHsCj3*-.HHseWHHc3Z ((Q/Aq!$!!RXXsCj%9%A%A"a%HIrG   r\   dtype_br]   mnc                    ||cxk(  rdk7  rn nt        j                  d       t        j                  j	                  d      }t        j
                  ||f|      }t        j
                  ||f|      }t        j
                  ||f|      }	t        |||	      }
|j                  d      dz  j                  |      }|j                  d      dz  j                  |      }|j                  d      dz  j                  |      }	t        |||	      }|
j                  ||fk(  sJ |
j                  |j                  k(  sJ y )	Nr   z6m = n != 0 is not a case that needs to be tested here.l   >& r_   ra   rb   )r8   r8   )r6   r8   )
rr   skipr   rc   rd   re   r   rf   rg   r`   )rC   r  r   r\   r  r]   rh   rM   r   rN   ri   rj   s               r   rk   zTestSolveSylvester.test_size_0H  s    ;Q;KKPQii##O4HHaV7+HHaV7+HHaV7+aA&ZZ#++G4ZZ#++G4ZZ#++G4aA&yyQF"""yyCII%%%rG   N)rl   rm   rn   r   ro   rp   rX   r  r[   r  rr   rs   rt   ru   rk   rv   rG   r   r  r    s    
&		&		&		 "((6
	&		&	
 "((6
	&		&	
 
Aq6Aq6"	#	Aq6Aq6"	#	Ar7RH%	&	(
 
>%"! 
" 
#%"! 
" 
>!!!# 
$	% 
FC=8S/2	3	D":Sz*	+	FF#gs^4	5	7 
C:Sz*	+	D!9sCj)	*	FF#gs^4	5	7 
FC=8S/2	3	D!9sCj)	*	FF#gs^4	5	7 
FC=8S/2	3	D!9sCj)	*	C:c{+	,	. 
9i3	4	Aq6Aq6"	#	Aq6Aq6Aq6*	+	- 
=)Y7	8	Aq6At9%	&	Ar7QGb$Z0	1	3e5EnB7J [[Y/[[Y/[[Y/[[S1a&)[[S1a&)& * * 0 0 0
&rG   r  )%r   numpyr   numpy.testingr   r   rr   r   rA   scipy.linalgr   r   r   r	   r
   r   r   r   scipy.sparse._sputilsr   scipy.conftestr   intfloatfloat32complex	complex64ru   r    r"   rx   r   r   r   r   r  r  rv   rG   r   <module>r-     s    	  D  * ( K A 7 7 ( . ubjj'2<<	8h& h&VAH AHHsE sEl- - /.dD+N.Ab`& `&rG   