
    -i9                        S r SSKJr  SSKJr  SSKrSSKrSSKJ	r	J
r
JrJr  SSKJr  SSKrSSKJr  SSKrSSKJr  SS	KJrJrJrJrJrJr  SS
KJr  \R<                  \R>                  1r \RB                  \\RD                  \RF                  \RH                  \RJ                  4r&\RN                  \RP                  \RR                  4r*\&\*-   r+S r,S r- " S S5      r. " S S5      r/\R`                  Rb                  \R`                  Re                  S\+5      \R`                  Re                  S\+5      \R`                  Re                  SSS/5      S 5       5       5       5       r3g)z;Test functions for the sparse.linalg._expm_multiply module.    )partial)productN)assert_allcloseassert_assert_equalsuppress_warnings)SparseEfficiencyWarning)aslinearoperator)expm)_theta_compute_p_max_onenormest_matrix_powerexpm_multiply_expm_multiply_simple_expm_multiply_interval)np_longc                    ^  U 4S jnU$ )zIf trace is estimated, it should warn.

We warn that estimation of trace might impact performance.
All result have to be correct nevertheless!

c                  |   > [         R                  " [        SS9   T" U 0 UD6sS S S 5        $ ! , (       d  f       g = f)Nz%Trace of LinearOperator not available)match)pytestwarnsUserWarning)argskwdsfuncs     _/var/www/html/venv/lib/python3.13/site-packages/scipy/sparse/linalg/tests/test_expm_multiply.pywrappedestimated.<locals>.wrapped"   s5    \\+ GI&&I I Is   -
; )r   r   s   ` r   	estimatedr       s    ' N    c                 D    [         R                  " X5      =(       d    X:  $ )N)npallclose)abs     r   less_than_or_closer'   )   s    ;;q''r!   c                      \ rS rSrSrS rS rS rS r\	R                  R                  S 5       r\	R                  R                  S 5       r\	R                  R                  S	 5       r\	R                  R                  S
 5       r\	R                  R                  S 5       r\	R                  R                  S 5       rSrg)TestExpmActionSimple-   zJ
These tests do not consider the case of multiple time steps in one call.
c                     [        [        R                  " 5       5      n[        US S USS  5       H  u  u  p#u  pE[	        X5:  5        M     g )N   )sortedr   itemszipr   )selfpairsm_atheta_am_btheta_bs         r   test_theta_monotonicity,TestExpmActionSimple.test_theta_monotonicity2   sD    v||~&.1%*eABi.H*NSNSG%& /Ir!   c                 8    SnSn[        U5      n[        X25        g )N7      )r   r   )r1   m_maxexpected_p_maxobserved_p_maxs       r   test_p_max_default'TestExpmActionSimple.test_p_max_default7   s    '.^4r!   c                     [        SS5       H?  n[        U5      n[        X"S-
  -  US-   :*  5        US-   n[        X3S-
  -  US-   :  5        MA     g )Nr-   8   )ranger   r   )r1   r<   p_max	p_too_bigs       r   test_p_max_range%TestExpmActionSimple.test_p_max_range=   sU    1d^E"5)EE19%23	II1}-	9:	 $r!   c           	         [         R                  R                  S5      nSnSn[        U5       H  n[        R
                  R                  UR                  X"5      5      n[        S5       H  nU(       d  [         R                  " U5      nO[         R                  " WU5      n[        XV5      n[         R
                  R                  US5      n	[        [        X5      5        [        [        U	SU-  5      5        M     M     g )N  (   
      r-      )r#   randomRandomStaterC   scipylinalginvrandnidentitydotr   normr   r'   )
r1   rngnnsamplesiApMr    exacts
             r   test_onenormest_matrix_power1TestExpmActionSimple.test_onenormest_matrix_powerD   s    ii##D)xA  11A1XAAq!A4Q:			q!,*9<=*5!I+>?  !r!   c                 P   [         R                  R                  S5        SnSnSn[        U5       H  n[        R
                  R                  [         R                  R                  X5      5      n[         R                  R                  X5      n[        XV5      n[         R                  " [        U5      U5      n[        Xx5        [        [        5      " [        U5      U5      n[        Xx5        [         R                  " U5      n	[        [        U5      XiS9n[        Xx5        M     g )NrI   rJ   rM   rK   traceA)r#   rN   seedrC   rP   rQ   rR   rS   r   rU   sp_expmr   r    r
   trace)
r1   rX   krY   rZ   r[   Bobservedexpectedrc   s
             r   test_expm_multiply'TestExpmActionSimple.test_expm_multiplyT   s    
		txA  !67A		%A$Q*Hvvgaj!,HH/ /0@0CQGHH/XXa[F$%5a%8!KHH/ !r!   c                    [         R                  R                  S5        SnSn[        U5       H  n[        R
                  R                  [         R                  R                  X5      5      n[         R                  R                  U5      n[        XE5      n[         R                  " [        U5      U5      n[        Xg5        [        [        5      " [        U5      U5      n[        Xg5        M     g )NrI   rJ   rK   )r#   rN   rd   rC   rP   rQ   rR   rS   r   rU   re   r   r    r
   )r1   rX   rY   rZ   r[   vri   rj   s           r   test_matrix_vector_multiply0TestExpmActionSimple.test_matrix_vector_multiplyf   s    
		txA  !67A		"A$Q*Hvvgaj!,HH/ /0@0CQGHH/ !r!   c                 `   [         R                  R                  S5        SnSnSn[        [	        U5      / SQ5       H  u  pE[         R
                  " SS9   [        R                  R                  [         R                  R                  X5      5      n[         R                  R                  X5      n[        XgUS9n[         R                  " [        XV-  5      U5      n	[        X5        [        [        5      " [        U5      XuS9n[        X5        S S S 5        M     g ! , (       d  f       M  = f)	NrI   rJ   rM   rK   )g?g      ?g      ?ignore)invalidt)r#   rN   rd   r   rC   errstaterP   rQ   rR   rS   r   rU   re   r   r    r
   )
r1   rX   rg   rY   rZ   ru   r[   rh   ri   rj   s
             r   test_scaled_expm_multiply.TestExpmActionSimple.test_scaled_expm_multiplyt   s    
		tE(O_=DAX.LL$$RYY__Q%:;IIOOA)0;66'!#,23$%:;$Q'  3 /. >..s   B;D
D-	c                 |   [         R                  R                  S5        SnSnSn[         R                  R                  X"5      n[         R                  R                  X#5      n[	        XEUS9n[        X-  5      R                  U5      n[        Xg5        [        [        5      " [        U5      XQS9n[        Xg5        g )NrI   皙?      rt   )
r#   rN   rd   rS   r   re   rU   r   r    r
   )r1   ru   rX   rg   r[   rh   ri   rj   s           r   *test_scaled_expm_multiply_single_timepoint?TestExpmActionSimple.test_scaled_expm_multiply_single_timepoint   s    
		tIIOOA!IIOOA!(313<##A&+23Q
 	+r!   c                 ,   [         R                  R                  S5      nSnSnSn[        U5       H  n[        R
                  R                  X"4SUS9nUR                  X#45      n[        Xg5      n[        5        n	U	R                  [        S5        U	R                  [        S5        [        U5      R                  U5      n
S S S 5        [        UW
5        [        [        5      " [!        U5      U5      n[        X5        M     g ! , (       d  f       NI= f)	NrI   rJ   rM   rK   皙?densityrW   &splu converted its input to CSC formatCspsolve is more efficient when sparse b is in the CSC matrix format)r#   rN   default_rngrC   rP   sparserandom_arraystandard_normalr   r   filterr	   re   rU   r   r    r
   )r1   rW   rX   rg   rY   rZ   r[   rh   ri   suprj   s              r   test_sparse_expm_multiply.TestExpmActionSimple.test_sparse_expm_multiply   s    ii##D)xA))1&$C)HA##QF+A$Q*H"$

2CE

201 #1:>>!, % Hh/ /0@0CQGHH/ ! %$s   ;AD
D	c                    [         R                  " SS/SS//[        S9n[         R                  " SS/5      n[        X5      n[         R                  " S[         R                  " S5      -  SS[         R
                  " S5      -  [         R                  " S5      -
  -  -   S[         R                  " S5      -  /[        S9n[        X45        [        [        5      " [        U5      U5      n[        X45        g )N              ?r   dtyper-   )
r#   arraycomplexr   expcossinr   r    r
   )r1   r[   rh   ri   rj   s        r   test_complex!TestExpmActionSimple.test_complex   s    HHHG#% HHb"X &88ObBrvvayL266!9$<==O$+- 	+]+,<Q,?C+r!   r   N)__name__
__module____qualname____firstlineno____doc__r7   r?   rF   r_   r   markthread_unsaferk   ro   rw   r}   r   r   __static_attributes__r   r!   r   r)   r)   -   s    '
5;@  [[0 0" [[0 0 [[4 4" [[, , [[0 0( [[, ,r!   r)   c                   \   \ rS rSr\R
                  R                  S5      S 5       r\R
                  R                  \R
                  R                  S5      S 5       5       r	\R
                  R                  \R
                  R                  S5      S 5       5       r
S rS rS rS	 rS
 rSrg)TestExpmActionInterval      c                 ^   [         R                  R                  S5      nSnSnSnSnSnS H  n[        R                  R                  XD4SUS	9nUR                  XE45      n	UR                  U45      n
X4 H  n[        XX#XvS
9n[         R                  " X#XvS
9n[        5        nUR                  [        S5        UR                  [        S5        [        X5       H-  u  nn[        U[        UU-  5      R                  U5      5        M/     S S S 5        M     M     g ! , (       d  f       M  = f)NrI   rz   皙	@rJ   rM   T      r|   r   r   startstopnumendpointr   r   )r#   rN   r   rP   r   r   r   r   linspacer   r   r	   r0   r   re   rU   )r1   rW   r   r   rX   rg   r   r   r[   rh   rn   targetXsamplesr   solutionru   s                    r   "test_sparse_expm_multiply_interval9TestExpmActionInterval.test_sparse_expm_multiply_interval   s   ii##D)C))1&$C)HA##QF+A##QD)A&!!5&)>++E*-B&(CJJ6GIJJ6 89 (+1!''!A#,2B2B62JK (7 )( !	  )(s   #A)D
D,c           	         [         R                  R                  S5        SSSS.n[        / SQ/ SQ5       GH  u  p#[        R
                  R                  [         R                  R                  X35      5      n[         R                  R                  U5      n[         R                  " SSU0UD6n[        XE4SU0UD6n[        Xv5       H+  u  p[        U[        X-  5      R                  U5      5        M-     [        [        5      " [        U5      U4SU0UD6n
[        [        U5      U4SU0UDS	[         R                   " U5      0D6n[        [        U5      U4SU0UDS	[         R                   " U5      S
-  0D6n[        XX5       HF  u  pp[        X-  5      R                  U5      n[        UU5        [        UU5        [        UU5        MH     GM     g )NrI   rz   r   Tr   r   r   r   r-   r|   r{   r   rJ   r   rc   r{   r   )r#   rN   rd   r   rP   rQ   rR   rS   r   r   r0   r   re   rU   r    r
   rf   )r1   intervalr   rX   r[   rn   r   r   r   ru   XguessXgivenXwrong	sol_guess	sol_given	sol_wrongcorrects                    r   "test_expm_multiply_interval_vector9TestExpmActionInterval.test_expm_multiply_interval_vector   s    			t #4@k+<=FC  !67A		"Akk6c6X6Ga88x8A"1'!#,*:*:1*=>  / }-.>q.A1 C25C9ACF ##3A#6 7s 7h 7*,((1+7F ##3A#6 9s 9h 9*,((1+a-9F69&:@7K2	i!!#,**1-	73	73	737K! >r!   c           	         [         R                  R                  S5        SSSS.n[        / SQ/ SQSS	/5       GH  u  p#n[        R
                  R                  [         R                  R                  X35      5      n[         R                  R                  X45      n[         R                  " SS
U0UD6n[        XV4S
U0UD6n[        X5       H+  u  p[        U	[        X-  5      R                  U5      5        M-     [        [        5      " [        U5      U4S
U0UD6n[        X5       H+  u  p[        U	[        X-  5      R                  U5      5        M-     GM!     g )NrI   rz   r   Tr   r   r   r-   r|   r   r   )r#   rN   rd   r   rP   rQ   rR   rS   r   r   r0   r   re   rU   r    r
   )r1   r   r   rX   rg   r[   rh   r   r   r   ru   s              r   "test_expm_multiply_interval_matrix9TestExpmActionInterval.test_expm_multiply_interval_matrix   s    			t #4@ .?!QHICA  !67A		%Akk6c6X6Ga88x8A"1'!#,*:*:1*=>  /-()9!)<a 5S 5+35A"1'!#,*:*:1*=>  / Ir!   c           
         [         R                  R                  [        R                  " S5      S[
        S9n[        R                  " S[
        S9n[         R                  R                  [        R                  " [        R                  " S5      5      SS9n[        R                  " S[
        S9n[         R                  R                  U5      n[        [        XSS5      S   UR                  U5      5        [        [        R                  " [        XSS5      S   5      UR                  U5      5        [         R                  R                  S	[        R                  " S5      -  S[        S9n[        R                  " S[
        S9n[         R                  R                  [        R                  " S	[        R                  " S5      -  5      SS9n[        [        XSS5      S   UR                  U5      5        [        [        R                  " [        XSS5      S   5      UR                  U5      5        [         R                  R                  [        R                  " S5      S[
        S9n[        R                  " SS
[        S9n[         R                  R                  [        R                  " [        R                  " S5      5      SS9n[        [        XSS5      S   UR                  U5      5        [        R                  " S[        S9S
-  n[        [        R                  " [        U[         R                  R                  U5      SS5      S   5      UR                  U5      5        g )Nr{   csr)formatr   r   )r   r   r-   r,   y             r   )rP   r   diags_arrayr#   arangeintonesr   rT   	csr_arrayr   r   rU   diagr   full)r1   r[   rh   AexpmBI	BI_sparses         r   )test_sparse_expm_multiply_interval_dtypes@TestExpmActionInterval.test_sparse_expm_multiply_interval_dtypes  sT   LL$$RYYq\c$JGGAS!((		!)=U(K[[#&LL**2.	a!A.r2EIIaLAaAq A" EF		RSU LL$$S1%5U'$RGGAS!((BIIaL0@)A(Oa!A.r2EIIaLAaAq A" EF		RSU LL$$RYYq\c$JGGAr)((		!)=U(Ka!A.r2EIIaLA[['*2-GGM!U\\%;%;B%?AFrJKIIaL	
r!   c                 &    U R                  S5        g )Nr   (_help_test_specific_expm_interval_statusr1   s    r   $test_expm_multiply_interval_status_0;TestExpmActionInterval.test_expm_multiply_interval_status_0      55a8r!   c                 &    U R                  S5        g )Nr-   r   r   s    r   $test_expm_multiply_interval_status_1;TestExpmActionInterval.test_expm_multiply_interval_status_1"  r   r!   c                 &    U R                  S5        g )Nr|   r   r   s    r   $test_expm_multiply_interval_status_2;TestExpmActionInterval.test_expm_multiply_interval_status_2%  r   r!   c                 &   [         R                  R                  S5      nSnSnSnSnSnSnSn	S	n
/ S
QU	-   H  nUR                  Xw5      nUR                  Xx5      n[	        XX4XVSS9nX:X  d  M8  [	        XX4XVSS9u  p[        UR                  XWU45        [         R                  " X4XVS9n[        X5       H-  u  nn[        U[        UU-  5      R                  U5      5        M/     U
S-  n
M     U
(       d  S[        U5      -   S-   n[        U5      eg )NrI   rz   r   r   Tr{   r|   rK   r   r   )r   r   r   r   status_onlyFr   r-   zfailed to find a status-z	 interval)r#   rN   rO   rS   r   r   shaper   r0   r   re   rU   str	Exception)r1   target_statusrW   r   r   r   r   rX   rg   nrepeats
nsuccessesr[   rh   statusr   r   r   ru   msgs                      r   r   ?TestExpmActionInterval._help_test_specific_expm_interval_status(  s    ii##D)
)C		!A		!A,Q $&F &3A#C$)+	 QWWsqk2++E4#&q?KHa#Hgacl.>.>q.AB $3a
 *  ,s=/AAKOCC.  r!   r   N)r   r   r   r   r   r   	fail_slowr   r   r   r   r   r   r   r   r   r   r   r!   r   r   r      s    [[2L L2 [[[[24  44 [[[[2?  ?
8999!r!   r   dtype_adtype_bb_is_matrixFTc                    X1[         -  (       a  [        [        SSS9O[        n[        R                  R                  S5      nSnU(       a  US4OU4nU [        ;   a?  [        R                  R                  UR	                  XU/5      5      R                  U 5      nOT[        R                  R                  UR	                  XU/5      SUR	                  XU/5      -  -   5      R                  U 5      nU[        ;   a$  SUR	                  U5      -  R                  U5      nO5UR	                  U5      SUR	                  U5      -  -   R                  U5      n[        Xx5      n	[        [        5      " [        U5      U5      n
[        R                  " [        U5      U5      nU" X5        U" X5        [        [        U5      U[        R                   " U5      S	9n
U" X5        S
SSSS.n[        R"                  " S0 UD6n[        Xx40 UD6n[        [        5      " [        U5      U40 UD6n[%        XU5       H3  u  pn[        UU-  5      R                  U5      nU" X5        U" X5        M5     g)zAMake sure `expm_multiply` handles all numerical dtypes correctly.gH}]?gh㈵>)rtolatolrI      rM   r   r|   rb   rz   r   r   Tr   Nr   )	IMPRECISEr   r   r#   rN   r   REAL_DTYPESrP   rQ   rR   astyper   r    r
   rU   re   rf   r   r0   )r   r   r   assert_allclose_rW   rX   b_shaper[   rh   sol_matsol_op
direct_solr   r   X_matX_opru   s                    r   test_expm_multiply_dtyper   G  s    $-	9  f4H?N 
))


%C	A#q!f!G+LLSZZ/077@LLJJvCJJv$6!66

&/ 	
 +szz'""**73ZZ 2cjj&9#99AA'J A!G}%&6q&91=F
A&JW)V(+A."((1+FFV( c"$GHkk%H%G!+(+E]#$4Q$7GhGD!%w7QqS\%%a(
-, 8r!   )4r   	functoolsr   	itertoolsr   numpyr#   r   numpy.testingr   r   r   r   scipy.sparser	   rP   scipy.sparse.linalgr
   scipy.linalgr   re   "scipy.sparse.linalg._expm_multiplyr   r   r   r   r   r   scipy._lib._utilr   singlecsingler   intclonglongfloat32float64
longdoubler   	complex64
complex128clongdoubleCOMPLEX_DTYPESDTYPESr    r'   r)   r   r   r   parametrizer   r   r!   r   <module>r     s,   A    . . 0  0  /! ! % YY

#	wwzz2::r}}6,,r~~>	~	%(J, J,ZJ! J!Z F+F+6$- 7 , , $-r!   