
    sg6                        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                  hZ&ejN                  ejP                  ejR                  hZ* e+e&e*z  e,      Z-d Z.d Z/ G d d      Z0 G d d      Z1ejd                  jg                  de-      ejd                  jg                  de-      ejd                  jg                  dddg      d                      Z4y)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_long)keyc                       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                   L    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Z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_monotonicity2   sN    v||~&.1%*eABi.H 	'*NS'NS'Gg%&	'r!   c                 :    d}d}t        |      }t        ||       y )N7      )r   r   )r0   m_maxexpected_p_maxobserved_p_maxs       r   test_p_max_defaultz'TestExpmActionSimple.test_p_max_default7   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   )r0   r:   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                  t         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seedr@   scipylinalginvrandnidentitydotr   normr   r'   )	r0   nnsamplesiApMr    exacts	            r   test_onenormest_matrix_powerz1TestExpmActionSimple.test_onenormest_matrix_powerD   s    
		tx 
	@A  A!67A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 )NrE   rF   rI   rG   traceA)r#   rJ   rK   r@   rL   rM   rN   rO   r   rQ   sp_expmr   r    r
   trace)
r0   rS   krT   rU   rV   Bobservedexpectedr]   s
             r   test_expm_multiplyz'TestExpmActionSimple.test_expm_multiplyT   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 )NrE   rF   rG   )r#   rJ   rK   r@   rL   rM   rN   rO   r   rQ   r^   r   r    r
   )r0   rS   rT   rU   rV   vrb   rc   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)	NrE   rF   rI   rG   )g?g      ?g      ?ignore)invalidt)r#   rJ   rK   r   r@   errstaterL   rM   rN   rO   r   rQ   r^   r   r    r
   )
r0   rS   r`   rT   rU   rl   rV   ra   rb   rc   s
             r   test_scaled_expm_multiplyz.TestExpmActionSimple.test_scaled_expm_multiplyr   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 )NrE   皙?      rk   )
r#   rJ   rK   rO   r   r^   rQ   r   r    r
   )r0   rl   rS   r`   rV   ra   rb   rc   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                 B   t         j                  j                  d       d}d}d}t        |      D ]  }t        j
                  j                  ||d      }t         j                  j                  ||      }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)	NrE   rF   rI   rG   皙?density&splu converted its input to CSC formatCspsolve is more efficient when sparse b is in the CSC matrix format)r#   rJ   rK   r@   rL   sparserandrO   r   r   filterr	   r^   rQ   r   r    r
   )
r0   rS   r`   rT   rU   rV   ra   rb   suprc   s
             r   test_sparse_expm_multiplyz.TestExpmActionSimple.test_sparse_expm_multiply   s    
		tx 	0A!!!Q!5A		1%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
   )r0   rV   ra   rb   rc   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__r6   r=   rC   rZ   rd   rg   rn   rs   r~   r   r   r!   r   r)   r)   -   s:    '
5;@ 0"04",0(,r!   r)   c                       e Zd Zej                  j                  d      d        Zej                  j                  d      d        Zej                  j                  d      d        Zd Z	d Z
d Zd Zd	 Zy
)TestExpmActionIntervalrq   c                    t         j                  j                  d       d}d}d}d}d}dD ]  }t        j                  j                  ||d	      }t         j                  j                  ||      }t         j                  j                  |      }	||	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)NrE   rp   皙	@rF   rI   T      rr   ru   rv   startstopnumendpointrx   ry   )r#   rJ   rK   rL   rz   r{   rO   r   linspacer   r|   r	   r/   r   r^   rQ   )r0   r   r   rS   r`   r   r   rV   ra   rf   targetXsamplesr}   solutionrl   s                   r   "test_sparse_expm_multiply_intervalz9TestExpmActionInterval.test_sparse_expm_multiply_interval   sI   
		t 	LC!!!Q!5A		1%A		"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   A(EE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 )NrE   rp   r   Tr   r   r   r   r,   rr   rq      rF   r   r]   rq   r   )r#   rJ   rK   r   rL   rM   rN   rO   r   r   r/   r   r^   rQ   r    r
   r_   )r0   intervalr   rS   rV   rf   r   r   r   rl   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 )NrE   rp   r   Tr   r   r   r,   rr   r   r   )r#   rJ   rK   r   rL   rM   rN   rO   r   r   r/   r   r^   rQ   r    r
   )r0   r   r   rS   r`   rV   ra   r   r   r   rl   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 )Nrq   csr)formatr   r   )r   r   r,   r+   y             r   )rL   rz   diagsr#   arangeintonesr   r   r   rQ   r   full)r0   rV   ra   Aexpms       r   )test_sparse_expm_multiply_interval_dtypesz@TestExpmActionInterval.test_sparse_expm_multiply_interval_dtypes   s   LLryy|5DGGAS!""266"))A,#7u"Ea!A.r2EIIaLA LLs299Q</uGLGGAS!""266#biil*:#;5"Ia!A.r2EIIaLA LLryy|5DGGAr)""266"))A,#7u"Ea!A.r2EIIaLAr!   c                 &    | j                  d       y )Nr   (_help_test_specific_expm_interval_statusr0   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 )Nrr   r   r   s    r   $test_expm_multiply_interval_status_2z;TestExpmActionInterval.test_expm_multiply_interval_status_2  r   r!   c           
      t   t         j                  j                  d       d}d}d}d}d}d}d}d	}	g d
|z  D ]  }t         j                  j                  ||      }
t         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 )NrE   rp   r   r   Trq   rr   rG   r   r   )r   r   r   r   status_onlyFr   r,   zfailed to find a status-z	 interval)r#   rJ   rK   rO   r   r   shaper   r/   r   r^   rQ   str	Exception)r0   target_statusr   r   r   r   rS   r`   nrepeats
nsuccessesrV   ra   statusr   r   r   rl   msgs                     r   r   z?TestExpmActionInterval._help_test_specific_expm_interval_status  sN   
		t
) 	 C		1%A		1%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   mark	fail_slowr   r   r   r   r   r   r   r   r   r!   r   r   r      s    [[1L L2 [[14 44 [[1? ?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.ga2U0*S?gh㈵>)rtolatolrE      rI   r   rr   r\   rp   r   r   Tr   Nr   )	IMPRECISEr   r   r#   rJ   default_rngREAL_DTYPESrL   rM   rN   astyper   r    r
   rQ   r^   r_   r   r/   )r   r   r   assert_allclose_rngrS   b_shaperV   ra   sol_matsol_op
direct_solr   r   X_matX_oprl   s                    r   test_expm_multiply_dtyper   6  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!   )5r   	functoolsr   	itertoolsr   numpyr#   r   numpy.testingr   r   r   r   scipy.sparser	   scipy.sparse.linalgr
   scipy.linalgrL   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_DTYPESr-   r   DTYPESr    r'   r)   r   r   parametrizer   r   r!   r   <module>r      s   A    . . 0 0  /! ! % YY

#	wwzz2::r}}6,,r~~>	n,#	6(D, D,N! !D F+F+6$- 7 , ,$-r!   