
    g08                        d Z ddlmZ ddlmZ ddlZddlZddlm	Z	m
Z
mZmZ ddlmZ ddlmZ ddlZddlmZ dd	lmZmZmZmZmZmZ dd
lmZ ej<                  ej>                  hZ ejB                  eejD                  ejF                  ejH                  ejJ                  fZ&ejN                  ejP                  ejR                  fZ*e&e*z   Z+d Z,d Z- G d d      Z. G d d      Z/ej`                  jb                  ej`                  je                  de+      ej`                  je                  de+      ej`                  je                  dddg      d                             Z3y)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                       fd}|S )zIf trace is estimated, it should warn.

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

    c                  v    t        j                  t        d      5   | i |cd d d        S # 1 sw Y   y xY w)Nz%Trace of LinearOperator not available)match)pytestwarnsUserWarning)argskwdsfuncs     _/var/www/html/venv/lib/python3.12/site-packages/scipy/sparse/linalg/tests/test_expm_multiply.pywrappedzestimated.<locals>.wrapped!   s7    \\+ GI 	'&&	' 	' 	's   /8 )r   r   s   ` r   	estimatedr      s    ' N    c                 <    t        j                  | |      xs | |k  S )N)npallclose)abs     r   less_than_or_closer&   (   s    ;;q!'Q'r    c                   x   e Zd ZdZd Zd Zd Zd Zej                  j                  d        Zej                  j                  d        Zej                  j                  d        Zej                  j                  d	        Zej                  j                  d
        Zej                  j                  d        Zy)TestExpmActionSimplezR
    These tests do not consider the case of multiple time steps in one call.
    c                     t        t        j                               }t        |d d |dd        D ]  \  \  }}\  }}t	        ||k          y )N   )sortedr   itemszipr   )selfpairsm_atheta_am_btheta_bs         r   test_theta_monotonicityz,TestExpmActionSimple.test_theta_monotonicity1   sN    v||~&.1%*eABi.H 	'*NS'NS'Gg%&	'r    c                 :    d}d}t        |      }t        ||       y )N7      )r   r   )r/   m_maxexpected_p_maxobserved_p_maxs       r   test_p_max_defaultz'TestExpmActionSimple.test_p_max_default6   s     '.^^4r    c                     t        dd      D ]@  }t        |      }t        ||dz
  z  |dz   k         |dz   }t        ||dz
  z  |dz   kD         B y )Nr+   8   )ranger   r   )r/   r9   p_max	p_too_bigs       r   test_p_max_rangez%TestExpmActionSimple.test_p_max_range<   s^    1d^ 	;E"5)EE519%23	IIy1}-	9:		;r    c           	         t         j                  j                  d      }d}d}t        |      D ]  }t        j
                  j                  |j                  ||            }t        d      D ]  }|st        j                  |      }nt        j                  |      }t        ||      }t         j
                  j                  |d      }	t        t        ||	             t        t        |	d|z                 y )N  (   
      r+      )r"   randomRandomStater?   scipylinalginvrandnidentitydotr   normr   r&   )
r/   rngnnsamplesiApMr   exacts
             r   test_onenormest_matrix_powerz1TestExpmActionSimple.test_onenormest_matrix_powerC   s    ii##D)x 
	@A  1a1A1X @AAq!A4Q:			q!,*9e<=*5!I+>?@
	@r    c                 \   t         j                  j                  d       d}d}d}t        |      D ]  }t        j
                  j                  t         j                  j                  ||            }t         j                  j                  ||      }t        ||      }t        j                  t        |      |      }t        ||        t        t              t        |      |      }t        ||       t        j                  |      }	t        t        |      ||	      }t        ||        y )NrD   rE   rH   rF   traceA)r"   rI   seedr?   rK   rL   rM   rN   r   rP   sp_expmr   r   r
   trace)
r/   rS   krT   rU   rV   Bobservedexpectedr]   s
             r   test_expm_multiplyz'TestExpmActionSimple.test_expm_multiplyS   s    
		tx 
	0A  A!67A		1%A$Q*Hvvgaj!,HHh//y/0@0CQGHHh/XXa[F$%5a%8!FKHHh/
	0r    c                    t         j                  j                  d       d}d}t        |      D ]  }t        j
                  j                  t         j                  j                  ||            }t         j                  j                  |      }t        ||      }t        j                  t        |      |      }t        ||        t        t              t        |      |      }t        ||        y )NrD   rE   rF   )r"   rI   r^   r?   rK   rL   rM   rN   r   rP   r_   r   r   r
   )r/   rS   rT   rU   rV   vrc   rd   s           r   test_matrix_vector_multiplyz0TestExpmActionSimple.test_matrix_vector_multiplye   s    
		tx 	0A  A!67A		"A$Q*Hvvgaj!,HHh//y/0@0CQGHHh/	0r    c                 n   t         j                  j                  d       d}d}d}t        t	        |      g d      D ]  \  }}t        j
                  d      5  t        j                  j                  t         j                  j                  ||            }t         j                  j                  ||      }t        |||      }t        j                  t        ||z        |      }	t        ||	        t        t              t        |      ||      }t        ||	       d d d         y # 1 sw Y   xY w)	NrD   rE   rH   rF   )g?g      ?g      ?ignore)invalidt)r"   rI   r^   r   r?   errstaterK   rL   rM   rN   r   rP   r_   r   r   r
   )
r/   rS   ra   rT   rU   rm   rV   rb   rc   rd   s
             r   test_scaled_expm_multiplyz.TestExpmActionSimple.test_scaled_expm_multiplys   s    
		tE(O_= 
	4DAqX. 	4LL$$RYY__Q%:;IIOOAq)0A;66'!A#,2(3;9%:;$Q'a  (3	4 	4
	4	4 	4s   CD++D4	c                    t         j                  j                  d       d}d}d}t         j                  j                  ||      }t         j                  j                  ||      }t	        |||      }t        ||z        j                  |      }t        ||        t        t              t        |      ||      }t        ||       y )NrD   皙?      rl   )
r"   rI   r^   rN   r   r_   rP   r   r   r
   )r/   rm   rS   ra   rV   rb   rc   rd   s           r   *test_scaled_expm_multiply_single_timepointz?TestExpmActionSimple.test_scaled_expm_multiply_single_timepoint   s    
		tIIOOAq!IIOOAq!(A31Q3<##A&(+3923Qa
 	(+r    c                 ,   t         j                  j                  d      }d}d}d}t        |      D ]  }t        j
                  j                  ||fd|      }|j                  ||f      }t        ||      }t               5 }	|	j                  t        d       |	j                  t        d       t        |      j                  |      }
d d d        t        |
        t        t              t!        |      |      }t        ||
        y # 1 sw Y   CxY w)	NrD   rE   rH   rF   皙?densityrR   &splu converted its input to CSC formatCspsolve is more efficient when sparse b is in the CSC matrix format)r"   rI   default_rngr?   rK   sparserandom_arraystandard_normalr   r   filterr	   r_   rP   r   r   r
   )r/   rR   rS   ra   rT   rU   rV   rb   rc   suprd   s              r   test_sparse_expm_multiplyz.TestExpmActionSimple.test_sparse_expm_multiply   s    ii##D)x 	0A))1a&$C)HA##QF+A$Q*H"$ -

2CE

201 #1:>>!,- Hh//y/0@0CQGHHh/	0- -s   AD

D	c                    t        j                  ddgddggt              }t        j                  ddg      }t        ||      }t        j                  dt        j                  d      z  ddt        j
                  d      z  t        j                  d      z
  z  z   dt        j                  d      z  gt              }t        ||        t        t              t        |      |      }t        ||       y )N              ?r   dtyper+   )
r"   arraycomplexr   expcossinr   r   r
   )r/   rV   rb   rc   rd   s        r   test_complexz!TestExpmActionSimple.test_complex   s    HHHG#% HHb"X A&88ObBrvvayL266!9$<==O$+- 	(++9]+,<Q,?C(+r    N)__name__
__module____qualname____doc__r5   r<   rB   rZ   r   markthread_unsafere   rh   ro   rt   r   r   r   r    r   r(   r(   ,   s    '
5;@  [[0 0" [[0 0 [[4 4" [[, , [[0 0( [[, ,r    r(   c                   T   e Zd Zej                  j                  d      d        Zej                  j                  ej                  j                  d      d               Zej                  j                  ej                  j                  d      d               Z	d Z
d Zd Zd Zd	 Zy
)TestExpmActionInterval   c                 j   t         j                  j                  d      }d}d}d}d}d}dD ]  }t        j                  j                  ||fd|	      }|j                  ||f      }	|j                  |f      }
|	|
fD ]  }t        ||||||
      }t        j                  ||||
      }t               5 }|j                  t        d       |j                  t        d       t        ||      D ],  \  }}t        |t        ||z        j                  |             . 	 d d d          y # 1 sw Y   xY w)NrD   rq   皙	@rE   rH   T      rs   rv   rw   startstopnumendpointry   rz   )r"   rI   r{   rK   r|   r}   r~   r   linspacer   r   r	   r.   r   r_   rP   )r/   rR   r   r   rS   ra   r   r   rV   rb   rg   targetXsamplesr   solutionrm   s                    r   "test_sparse_expm_multiply_intervalz9TestExpmActionInterval.test_sparse_expm_multiply_interval   sQ   ii##D) 	LC))1a&$C)HA##QF+A##QD)Aa& L!!V5t&)H>++E*-B&( LCJJ6GIJJ6 89 (+1g L!''!A#,2B2B62JKLL LL		LL Ls   3A(D))D2c           	         t         j                  j                  d       dddd}t        g dg d      D ]  \  }}t        j
                  j                  t         j                  j                  ||            }t         j                  j                  |      }t        j                  dd|i|}t        ||fd|i|}t        ||      D ],  \  }}	t        |t        |	|z        j                  |             .  t        t              t        |      |fd|i|}
t        t        |      |fd|i|d	t        j                   |      i}t        t        |      |fd|i|d	t        j                   |      d
z  i}t        |
|||      D ]H  \  }}}}	t        |	|z        j                  |      }t        ||       t        ||       t        ||       J  y )NrD   rq   r   Tr   r   r   r   r+   rs   rr   r   rE   r   r]   rr   r   )r"   rI   r^   r   rK   rL   rM   rN   r   r   r.   r   r_   rP   r   r
   r`   )r/   intervalr   rS   rV   rg   r   r   r   rm   XguessXgivenXwrong	sol_guess	sol_given	sol_wrongcorrects                    r   "test_expm_multiply_interval_vectorz9TestExpmActionInterval.test_expm_multiply_interval_vector   s    			t #4@k+<= 	4FC  A!67A		"Akk6c6X6Ga88x8A"1g ?!'!A#,*:*:1*=>? .Y}-.>q.A1 C25C9ACF ##3A#6 7s 7h 7*,((1+7F ##3A#6 9s 9h 9*,((1+a-9F69&&:@'7K 42	9i!!A#,**1-	73	73	734!	4r    c           	         t         j                  j                  d       dddd}t        g dg ddd	g      D ]"  \  }}}t        j
                  j                  t         j                  j                  ||            }t         j                  j                  ||      }t        j                  dd
|i|}t        ||fd
|i|}t        ||      D ],  \  }	}
t        |	t        |
|z        j                  |             .  t        t              t        |      |fd
|i|}t        ||      D ],  \  }	}
t        |	t        |
|z        j                  |             . % y )NrD   rq   r   Tr   r   r   r+   rs   r   r   )r"   rI   r^   r   rK   rL   rM   rN   r   r   r.   r   r_   rP   r   r
   )r/   r   r   rS   ra   rV   rb   r   r   r   rm   s              r   "test_expm_multiply_interval_matrixz9TestExpmActionInterval.test_expm_multiply_interval_matrix   s<    			t #4@ .?!QH 
	?ICA  A!67A		1%Akk6c6X6Ga88x8A"1g ?!'!A#,*:*:1*=>?(	-()9!)<a 5S 5+35A"1g ?!'!A#,*:*:1*=>?
	?r    c                    t         j                  j                  t        j                  d      dt
              }t        j                  dt
              }t         j                  j                  t        j                  t        j                  d            d      }t        t        ||dd      d   |j                  |             t         j                  j                  d	t        j                  d      z  dt              }t        j                  dt
              }t         j                  j                  t        j                  d	t        j                  d      z        d      }t        t        ||dd      d   |j                  |             t         j                  j                  t        j                  d      dt
              }t        j                  dd
t              }t         j                  j                  t        j                  t        j                  d            d      }t        t        ||dd      d   |j                  |             y )Nrr   csr)formatr   r   )r   r   r+   r*   y             r   )rK   r|   diags_arrayr"   arangeintonesr   r   r   rP   r   full)r/   rV   rb   Aexpms       r   )test_sparse_expm_multiply_interval_dtypesz@TestExpmActionInterval.test_sparse_expm_multiply_interval_dtypes  s   LL$$RYYq\c$JGGAS!((		!)=U(Ka!A.r2EIIaLA LL$$S1%5U'$RGGAS!((BIIaL0@)A(Oa!A.r2EIIaLA LL$$RYYq\c$JGGAr)((		!)=U(Ka!A.r2EIIaLAr    c                 &    | j                  d       y )Nr   (_help_test_specific_expm_interval_statusr/   s    r   $test_expm_multiply_interval_status_0z;TestExpmActionInterval.test_expm_multiply_interval_status_0      55a8r    c                 &    | j                  d       y )Nr+   r   r   s    r   $test_expm_multiply_interval_status_1z;TestExpmActionInterval.test_expm_multiply_interval_status_1  r   r    c                 &    | j                  d       y )Nrs   r   r   s    r   $test_expm_multiply_interval_status_2z;TestExpmActionInterval.test_expm_multiply_interval_status_2  r   r    c           
      <   t         j                  j                  d      }d}d}d}d}d}d}d}	d	}
g d
|	z  D ]  }|j                  ||      }|j                  ||      }t	        ||||||d      }||k(  s?t	        ||||||d      \  }}t        |j                  |||f       t        j                  ||||      }t        ||      D ],  \  }}t        |t        ||z        j                  |             . |
dz  }
 |
sdt        |      z   dz   }t        |      y )NrD   rq   r   r   Trr   rs   rF   r   r   )r   r   r   r   status_onlyFr   r+   zfailed to find a status-z	 interval)r"   rI   rJ   rN   r   r   shaper   r.   r   r_   rP   str	Exception)r/   target_statusrR   r   r   r   r   rS   ra   nrepeats
nsuccessesrV   rb   statusr   r   r   rm   msgs                      r   r   z?TestExpmActionInterval._help_test_specific_expm_interval_status  sH   ii##D)
) 	 C		!QA		!QA,Qdh $&F &3Aq#$C($)+	6 QWWsAqk2++E(4#&q'? CKHa#Hgacl.>.>q.ABCa
	   ,s=/AAKOCC.  r    N)r   r   r   r   r   	fail_slowr   r   r   r   r   r   r   r   r   r   r    r   r   r      s    [[2L L2 [[[[24  44 [[[[2?  ?B&999!r    r   dtype_adtype_bb_is_matrixFTc                    | |ht         z  rt        t        dd      nt        }t        j                  j                  d      }d}|r|dfn|f}| t        v r@t        j                  j                  |j	                  ||g            j                  |       }nVt        j                  j                  |j	                  ||g      d|j	                  ||g      z  z         j                  |       }|t        v r$d|j	                  |      z  j                  |      }n5|j	                  |      d|j	                  |      z  z   j                  |      }t        ||      }	 t        t              t        |      |      }
t        j                  t        |      |      } ||	|        ||
|       t        t        |      |t        j                   |      	      }
 ||
|       d
dddd}t        j"                  di |}t        ||fi |} t        t              t        |      |fi |}t%        |||      D ]5  \  }	}
}t        ||z        j                  |      } ||	|        ||
|       7 y)zAMake sure `expm_multiply` handles all numerical dtypes correctly.gH}]?gh㈵>)rtolatolrD      rH   r   rs   r\   rq   r   r   Tr   Nr   )	IMPRECISEr   r   r"   rI   r{   REAL_DTYPESrK   rL   rM   astyper   r   r
   rP   r_   r`   r   r.   )r   r   r   assert_allclose_rR   rS   b_shaperV   rb   sol_matsol_op
direct_solr   r   X_matX_oprm   s                    r   test_expm_multiply_dtyper   =  s.    $W-	9  f4H?N 
))


%C	A#q!f!G+LLSZZA/077@LLJJ1vCJJ1v$6!66

&/ 	
 +szz'""**73ZZ 2cjj&9#99AA'J Aq!G%Y}%&6q&91=F
A&JWj)VZ(+A."((1+FFVZ( c"$GHkk%H%G!Q+(+E#9]#$4Q$7GhGD!%w7 -QqS\%%a(
*-,-r    )4r   	functoolsr   	itertoolsr   numpyr"   r   numpy.testingr   r   r   r   scipy.sparser	   scipy.sparse.linalgr
   scipy.linalgrK   r   r_   "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A! A!H F+F+6$- 7 , , $-r    