o
    ?Hh#`                     @   s  d Z ddlZddlmZmZmZmZmZmZm	Z	m
Z
mZmZmZ ddlmZmZmZmZmZmZ ddlZddlmZ ddlmZmZmZ G dd dZG d	d
 d
ZG dd deZG dd deZG dd dZ G dd dZ!G dd dZ"G dd de"Z#G dd de"Z$G dd de"Z%G dd de"Z&e#e$e%e&gZ'dd Z(dd  Z)d!d" Z*d#d$ Z+d%d& Z,d'd( Z-d)d* Z.d+d, Z/G d-d. d.Z0G d/d0 d0e0Z1G d1d2 d2e0Z2G d3d4 d4e0Z3G d5d6 d6e0Z4G d7d8 d8e0Z5d9d: Z6d;d< Z7d=d> Z8d?d@ Z9dAdB Z:dS )Cz"
Tests for numerical integration.
    N)arangezerosarraydotsqrtcossineyepiexpallclose)assert_assert_array_almost_equalassert_allcloseassert_array_equalassert_equalassert_warns)raises)odeintodecomplex_odec                   @   s   e Zd Zdd Zdd ZdS )
TestOdeintc                    s   t d jd}t j j|dd\}}t || t fdd j|ddd\}}t || t drmt j j| jdd	\}}t || t fd
d j| fddddd\}}t || d S d S )N        g?Tfull_outputc                         || S Nftyproblem d/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/scipy/integrate/tests/test_integrate.py<lambda>        z(TestOdeint._do_problem.<locals>.<lambda>)r   tfirstjac)Dfunr   c                    r   r   r   r   r"   r$   r%   r&   +   r'   c                    r   r   r)   r   r"   r$   r%   r&   ,   r'   )r*   r   r(   )	r   stop_tr   r   z0r   verifyhasattrr)   )selfr#   r    zinfodictr$   r"   r%   _do_problem   s$   




zTestOdeint._do_problemc                 C   s&   t D ]}| }|jrq| | qd S r   PROBLEMScmplxr3   r0   problem_clsr#   r$   r$   r%   test_odeint0   s   zTestOdeint.test_odeintN)__name__
__module____qualname__r3   r9   r$   r$   r$   r%   r      s    r   c                   @   s   e Zd ZdZdddZdS )TestODEClassNadamsc           	         s    fdd}d }t  dr fdd}i } jd us jd ur) j|d<  j|d< | ||}|j|f jd  jd |d	| |j jd
d |	 j
}t||j t|  |f t| dk |f t t|g j
 |f d S )Nc                    r   r   r   r    r1   r"   r$   r%   r   ?      z#TestODEClass._do_problem.<locals>.fr)   c                    r   r   r+   r?   r"   r$   r%   r)   C   r@   z%TestODEClass._do_problem.<locals>.jacubandlband
   )atolrtolmethodr   )r    r   )r/   rB   rA   	ode_classset_integratorrD   rE   set_initial_valuer-   	integrater,   r   r!   r   
successfulget_return_coder.   r   )	r0   r#   
integratorrF   r   r)   integrator_paramsigr1   r$   r"   r%   r3   <   s,   


"zTestODEClass._do_problem)r>   )r:   r;   r<   rG   r3   r$   r$   r$   r%   r=   8   s    r=   c                   @   sP   e Zd ZeZdd Zdd Zdd Zdd Zd	d
 Z	e
jjdd Zdd ZdS )TestOdec                 C   s>   t D ]}| }|jrq|js| |dd | |dd qd S Nvoder>   bdf)r5   r6   stiffr3   r7   r$   r$   r%   	test_vode_   s   zTestOde.test_vodec                 C   s6   t D ]}| }|js| |dd | |dd qd S )Nzvoder>   rS   r5   rT   r3   r7   r$   r$   r%   
test_zvodei   s   zTestOde.test_zvodec                 C   s(   t D ]}| }|jrq| |d qd S Nlsodar4   r7   r$   r$   r%   
test_lsodaq   s   zTestOde.test_lsodac                 C   <   t D ]}| }|jrq|jrqt|drq| |d qd S Nr)   dopri5r5   r6   rT   r/   r3   r7   r$   r$   r%   test_dopri5y      
zTestOde.test_dopri5c                 C   r\   Nr)   dop853r_   r7   r$   r$   r%   test_dop853   ra   zTestOde.test_dop853c                 C   s~   dD ]:}dd }t ||}|dd t ||}|dd ||jd  ||jd  tt|j|jd  qd S )N)rR   rV   rZ   c                 S      dS N      ?r$   r   r$   r$   r%   r         z'TestOde.test_concurrent_fail.<locals>.fr   皙?)r   rH   rI   rJ   r    assert_raisesRuntimeError)r0   solr   rr2r$   r$   r%   test_concurrent_fail   s   zTestOde.test_concurrent_failc                 C   sX  dd }t dD ]}dD ]I}|dv r|dkrqt||}|dd t||}|dd ||jd  ||jd  ||jd  t|jd t|jd	 qd
D ]P}t||}|dd t||}|dd ||jd  ||jd  ||jd  ||jd  ||jd  t|jd t|jd	 qXqd S )Nc                 S   re   rf   r$   r   r$   r$   r%   r      rh   z%TestOde.test_concurrent_ok.<locals>.f   )rR   rV   rZ   r^   rc   >   rR   rZ   rV      r   ri   g?r^   rc   g333333?)ranger   rH   rI   rJ   r    r   r!   )r0   num_parallel_threadsr   krl   rm   rn   r$   r$   r%   test_concurrent_ok   s8   zTestOde.test_concurrent_okN)r:   r;   r<   r   rG   rU   rX   r[   r`   rd   pytestmarkthread_unsafero   rv   r$   r$   r$   r%   rP   [   s    

rP   c                   @   s0   e Zd ZeZdd Zdd Zdd Zdd Zd	S )
TestComplexOdec                 C   s8   t D ]}| }|js| |dd q| |dd qd S rQ   rW   r7   r$   r$   r%   rU      s   zTestComplexOde.test_vodec                 C   s    t D ]}| }| |d qd S rY   )r5   r3   r7   r$   r$   r%   r[      s   zTestComplexOde.test_lsodac                 C   4   t D ]}| }|jrqt|drq| |d qd S r]   r5   rT   r/   r3   r7   r$   r$   r%   r`         
zTestComplexOde.test_dopri5c                 C   r{   rb   r|   r7   r$   r$   r%   rd      r}   zTestComplexOde.test_dop853N)	r:   r;   r<   r   rG   rU   r[   r`   rd   r$   r$   r$   r%   rz      s    	
rz   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )
TestSoloutc           	         s   g  g d}d}ddg} fdd}dd }t ||}|| ||| ||}td	 | td
 | t d	 | t d
 | d S )Nr         $@rg          @c                         |   |  d S r   appendcopyr   tsysr$   r%   solout      
z+TestSolout._run_solout_test.<locals>.soloutc                 S      |d |d  |d d  gS Nr   rq      r$   r   r$   r$   r%   rhs      z(TestSolout._run_solout_test.<locals>.rhsr   )r   rH   
set_soloutrI   rJ   r   r   	r0   rM   t0tendy0r   r   rO   retr$   r   r%   _run_solout_test   s   

zTestSolout._run_solout_testc                 C      dD ]}|  | qd S Nrr   r   r0   rM   r$   r$   r%   test_solout     zTestSolout.test_soloutc           	         s   g  g d}d}ddg} fdd}dd }t ||}||| || ||}td	 | td
 | t d	 | t d
 | d S )Nr   r   rg   r   c                    r   r   r   r   r   r$   r%   r     r   z9TestSolout._run_solout_after_initial_test.<locals>.soloutc                 S   r   r   r$   r   r$   r$   r%   r     r   z6TestSolout._run_solout_after_initial_test.<locals>.rhsr   r   )r   rH   rI   r   rJ   r   r   r   r$   r   r%   _run_solout_after_initial_test  s   

z)TestSolout._run_solout_after_initial_testc                 C   r   r   )r   r   r$   r$   r%   test_solout_after_initial'  r   z$TestSolout.test_solout_after_initialc                    s   g g d}d ddg} fdd}dd }t ||}|| ||| | }td	 | td
 | td	 | td
  d k td
  k  d S )Nr   r   rg   r   c                    ,    |   |  |  d krdS d S Nr   r   r   r   r   r   r   r$   r%   r   3  
   
z1TestSolout._run_solout_break_test.<locals>.soloutc                 S   r   r   r$   r   r$   r$   r%   r   9  r   z.TestSolout._run_solout_break_test.<locals>.rhsr   r   )r   rH   r   rI   rJ   r   r   r   r0   rM   r   r   r   r   rO   r   r$   r   r%   _run_solout_break_test+  s    

z!TestSolout._run_solout_break_testc                 C   r   r   r   r   r$   r$   r%   test_solout_breakF  r   zTestSolout.test_solout_breakN)	r:   r;   r<   r   r   r   r   r   r   r$   r$   r$   r%   r~      s    r~   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestComplexSoloutc           	         s   g  g d}d}dg} fdd}dd }t ||}|| ||| ||}td | td | t d | t d | d S )	Nr         4@c                    r   r   r   r   r   r$   r%   r   U  r   z2TestComplexSolout._run_solout_test.<locals>.soloutc                 S      d| d d  gS Nrg   r                 ?r$   r   r$   r$   r%   r   Y     z/TestComplexSolout._run_solout_test.<locals>.rhsr   r   )r   rH   r   rI   rJ   r   r   r   r$   r   r%   r   M  s   

z"TestComplexSolout._run_solout_testc                 C   r   r   r   r   r$   r$   r%   r   e  r   zTestComplexSolout.test_soloutc                    s   g g d}d dg} fdd}dd }t ||}|| ||| | }td | td | td | td  d	 k td  k  d S )
Nr   r   c                    r   r   r   r   r   r$   r%   r   q  r   z8TestComplexSolout._run_solout_break_test.<locals>.soloutc                 S   r   r   r$   r   r$   r$   r%   r   w  r   z5TestComplexSolout._run_solout_break_test.<locals>.rhsr   r   r   )r   rH   r   rI   rJ   r   r   r   r   r$   r   r%   r   i  s    

z(TestComplexSolout._run_solout_break_testc                 C   r   r   r   r   r$   r$   r%   r     r   z#TestComplexSolout.test_solout_breakN)r:   r;   r<   r   r   r   r   r$   r$   r$   r%   r   K  s
    r   c                   @   s0   e Zd ZdZdZdZdZg ZdZdZ	dZ
dZdS )ODEz
    ODE problem
    Frq   Ngư>gh㈵>)r:   r;   r<   __doc__rT   r6   r,   r-   rB   rA   rD   rE   r$   r$   r$   r%   r     s    r   c                   @   s:   e Zd ZdZdZeddgeZdZdZ	dd Z
dd	 Zd
S )SimpleOscillatorz
    Free vibration of a simple oscillator::
        m \ddot{u} + k u = 0, u(0) = u_0 \dot{u}(0) \dot{u}_0
    Solution::
        u(t) = u_0*cos(sqrt(k/m)*t)+\dot{u}_0*sin(sqrt(k/m)*t)/sqrt(k/m)
    gq=
ףp?rg   ri   g      @c                 C   s.   t dt}d|d< | j | j |d< t||S )N)r   r   rg   r   rq   )rq   r   )r   floatru   mr   )r0   r1   r    tmpr$   r$   r%   r     s   

zSimpleOscillator.fc                 C   s`   t | j| j }| jd t||  | jd t||  |  }t||d d df | j| jdS )Nr   rq   rD   rE   )	r   ru   r   r-   r   r   r   rD   rE   )r0   zsr    omegaur$   r$   r%   r.     s   0 zSimpleOscillator.verifyN)r:   r;   r<   r   r,   r   r   r-   ru   r   r   r.   r$   r$   r$   r%   r     s    r   c                   @   s@   e Zd ZdZde Zeg dZdZdd Z	dd Z
d	d
 ZdS )
ComplexExpzThe equation :lm:`\dot u = i u`gGz?)r   y               @y              @y              @y              @Tc                 C   s   d| S )Nr   r$   r0   r1   r    r$   r$   r%   r        zComplexExp.fc                 C   s   dt d S )Nr      )r	   r   r$   r$   r%   r)     r@   zComplexExp.jacc                 C   s&   | j td|  }t||| j| jdS )Nr   r   )r-   r   r   rD   rE   r0   r   r    r   r$   r$   r%   r.     s   zComplexExp.verifyN)r:   r;   r<   r   r
   r,   r   r-   r6   r   r)   r.   r$   r$   r$   r%   r     s    r   c                   @   s.   e Zd ZdZdZdgZdZdd Zdd Zd	S )
Piz'Integrate 1/(t + 1j) from t=-10 to t=10   r   Tc                 C   s   t d|d d  gS )Nrg   rC   r   r   r   r$   r$   r%   r        zPi.fc                 C   s.   dt d }t||dd d f | j| jdS )Ny              rC   r   r   )nparctanr   rD   rE   r   r$   r$   r%   r.     s    z	Pi.verifyN)	r:   r;   r<   r   r,   r-   r6   r   r.   r$   r$   r$   r%   r     s    r   c                   @   sH   e Zd ZdZdZdZg dZdZdZg dZ	dd	 Z
d
d Zdd ZdS )CoupledDecayze
    3 coupled decays suited for banded treatment
    (banded mode makes it necessary when N>>3)
    T      ?)g      @g      @g      *@rq   r   )g(\?gq=
ףp?g(\?c                 C   s`   | j }t|d  |d  |d  |d  |d |d   |d  |d  |d |d   gS r   )lmbdr   r   )r0   r1   r    r   r$   r$   r%   r     s
     zCoupledDecay.fc                    s   j }tjjj d dfdd  fdd}|dd|d   |dd|d  |dd|d   |dd|d  |dd|d    S )	Nrq   rp   Forderc                    s   | j |  | |f< d S r   )rA   )ricivaljr0   r$   r%   set_j  s   zCoupledDecay.jac.<locals>.set_jr   r   )r   r   r   rB   rA   )r0   r1   r    r   r   r$   r   r%   r)     s   zCoupledDecay.jacc              
   C   s8  t | j}|d |d  }|d |d  }|d |d  }t |d  | }t |d  | }t |d  | }	t | jd | | jd | | jd |d  | ||   | jd |	 | jd |d  | ||	   |d |d  | jd  | d| ||	  d| ||	     f }
t|
|| j| j	dS )Nrq   r   r   r   )
r   r   r   r   vstackr-   	transposer   rD   rE   )r0   r   r    r   d10d21d20e0e1e2r   r$   r$   r%   r.     s&   **zCoupledDecay.verifyN)r:   r;   r<   r   rT   r,   r-   rB   rA   r   r   r)   r.   r$   r$   r$   r%   r     s    r   c                 C   s   |d |d  g}|S Nrq   r   r$   )r    xdxdtr$   r$   r%   r     s   r   c                 C   s   t ddgddgg}|S )Nr   rg         r   )r    r   r   r$   r$   r%   r)     s   r)   c                 C   s   ||d  | |d  g}|S r   r$   r    r   r   r   r$   r$   r%   f1%     r   c                 C   s   t d|g| dgg}|S Nr   r   r    r   r   r   r$   r$   r%   jac1*     r   c                 C   s   ||d  | |d  g}|S r   r$   )r    r   omega1omega2r   r$   r$   r%   f20  r   r   c                 C   s   t d|g| dgg}|S r   r   )r    r   r   r   r   r$   r$   r%   jac25  r   r   c                 C   s&   |d |d  |d  |d  g}|S )Nr   rq   r$   r   r$   r$   r%   fv;  s   "r   c                 C   s"   t d|d g|d  dgg}|S )Nr   r   rq   r   r   r$   r$   r%   jacv@  s   r   c                   @   sX   e Zd ZdZdZdZdd Zdd Zdd	 Zd
d Z	dd Z
dd Zejjdd ZdS )ODECheckParameterUsez=Call an ode-class solver with several cases of parameter use. Fc                 C   s@   t ||}| jr|j| jdd| jd |S |j| jddd |S )Ng&.>gHz>)rD   rE   with_jacobianr   )r   solver_uses_jacrH   solver_name)r0   r   r)   solverr$   r$   r%   _get_solverO  s   
z ODECheckParameterUse._get_solverc                 C   s2   ddg}| |d |t t|jddg d S )Nrg   r   r   )rI   rJ   r
   r   r!   r0   r   icr$   r$   r%   _check_solver[  s   
z"ODECheckParameterUse._check_solverc                 C   s   |  tt}| | d S r   )r   r   r)   r   )r0   r   r$   r$   r%   test_no_paramsa  s   z#ODECheckParameterUse.test_no_paramsc                 C   s8   |  tt}d}|| | jr|| | | d S rf   )r   r   r   set_f_paramsr   set_jac_paramsr   r0   r   r   r$   r$   r%   test_one_scalar_parame  s   

z*ODECheckParameterUse.test_one_scalar_paramc                 C   s@   |  tt}d}d}||| | jr||| | | d S rf   )r   r   r   r   r   r   r   )r0   r   r   r   r$   r$   r%   test_two_scalar_paramsm  s   z+ODECheckParameterUse.test_two_scalar_paramsc                 C   s<   |  tt}ddg}|| | jr|| | | d S rf   )r   r   r   r   r   r   r   r   r$   r$   r%   test_vector_paramv  s   

z&ODECheckParameterUse.test_vector_paramc                 C   sB   |  tt}|j| jdd ddg}||d tt|jt	 d S )Nrq   )nstepsrg   r   )
r   r   r)   rH   r   rI   r   UserWarningrJ   r
   r   r$   r$   r%   test_warns_on_failure~  s
   z*ODECheckParameterUse.test_warns_on_failureN)r:   r;   r<   r   r   r   r   r   r   r   r   r   rw   rx   ry   r   r$   r$   r$   r%   r   F  s    	r   c                   @      e Zd ZdZdZdS )TestDOPRI5CheckParameterUser^   FNr:   r;   r<   r   r   r$   r$   r$   r%   r         r   c                   @   r   )TestDOP853CheckParameterUserc   FNr   r$   r$   r$   r%   r     r   r   c                   @   r   )TestVODECheckParameterUserR   TNr   r$   r$   r$   r%   r    r   r  c                   @   r   )TestZVODECheckParameterUserV   TNr   r$   r$   r$   r%   r    r   r  c                   @   r   )TestLSODACheckParameterUserZ   TNr   r$   r$   r$   r%   r    r   r  c                  C   s:   d} dg}t dd | |dd\}}t|t| gg d S )Nrq   r   c                 S   s   |  S r   r$   )r!   r    r$   r$   r%   r&     s    z*test_odeint_trivial_time.<locals>.<lambda>Tr   )r   r   r   r   )r   r    r!   infor$   r$   r%   test_odeint_trivial_time  s   r  c                     s  dd dd dd } dd   fd	d
}t g dg dg dg dg}td}t g d}t|||fddddd	\}}t|||fdddd| dd
\}}t|||fdddd ddd\}	}
t|||fdddd|dddd\}}t||dd t||	ddd t|	|d d t|d! |d!  t|
d! |d!  tfd"d#|||fddddfd$d#dd%
\}}t||dd&d' d S )(Nc                 S   s
   | | S r   )r   r!   r    cr$   r$   r%   func     
z)test_odeint_banded_jacobian.<locals>.funcc                 S   s   |S r   r$   r  r$   r$   r%   r)     rh   z(test_odeint_banded_jacobian.<locals>.jacc                 S   s   |j jddS NCr   Tr   r  r$   r$   r%   jac_transpose  s   z2test_odeint_banded_jacobian.<locals>.jac_transposec              
   S   sT   t t jdt |df t |t jt |ddf t jt |dddf f}|S )Nr   rq   r   )r   r   r_diag)r!   r    r  r)   r$   r$   r%   	bjac_rows  s   z.test_odeint_banded_jacobian.<locals>.bjac_rowsc                    s    | ||j jddS r
  r  r  )r  r$   r%   	bjac_cols  r   z.test_odeint_banded_jacobian.<locals>.bjac_cols)i3{Gz?r   r   )ri   g      g{Gz?r   )gMbP?r  g       r  )r   r   ri   r      )r   r   rC   d   TgvIh%<=gdy=i'  )argsr   rD   rE   mxstepr*   )r  r   rD   rE   r  r*   	col_derivr   rq   )r  r   rD   rE   r  r*   mlmu)	r  r   rD   rE   r  r*   r  r  r  zsol1 != sol2)err_msg-q=zsol1 != sol3)rD   r  zsol3 != sol4njec                        || |S r   r$   r    r!   r  )r  r$   r%   r&     r'   z-test_odeint_banded_jacobian.<locals>.<lambda>c                    r  r   r$   r   r+   r$   r%   r&     r'   )r  r   rD   rE   r  r*   r(   zsol1 != sol1ty)rE   r  )r   r   onesr   r   r   )r  r  r  r   r    sol1info1sol2info2sol3info3sol4info4sol1tyinfo1tyr$   )r  r  r)   r%   test_odeint_banded_jacobian  sN   





r,  c                  C   s   dd } dd }dd }dd }d	d
 }dd }dd }t tt|dddg t tt|dddg t tt| dddg|d t tt| dddg|d t tt|ddgddg|d d S )Nc                 S      d|  S Nr$   r   r    r$   r$   r%   sys1d  r   z!test_odeint_errors.<locals>.sys1dc                 S      dd S Nrg   r   r$   r0  r$   r$   r%   bad1  r   z test_odeint_errors.<locals>.bad1c                 S   re   Nfoor$   r0  r$   r$   r%   bad2  rh   z test_odeint_errors.<locals>.bad2c                 S   r2  r3  r$   r0  r$   r$   r%   bad_jac1  r   z$test_odeint_errors.<locals>.bad_jac1c                 S   s   dggS r5  r$   r0  r$   r$   r%   bad_jac2   r   z$test_odeint_errors.<locals>.bad_jac2c                 S   s   d| d  d| d  gS )Nr/  r   皙rq   r$   r0  r$   r$   r%   sys2d  s   z!test_odeint_errors.<locals>.sys2dc                 S   s   dd dgddggS )Nrg   r   r:  r$   r0  r$   r$   r%   sys2d_bad_jac  s   z)test_odeint_errors.<locals>.sys2d_bad_jacrg   r   rq   r*   )rj   ZeroDivisionErrorr   
ValueError)r1  r4  r7  r8  r9  r;  r<  r$   r$   r%   test_odeint_errors  s   
r@  c                  C   s   dd } dd }dd }ddgddgg}t tt||ddg ddgd	d
gg}t tt|dg| t tt| dddg t tt|ddgddg|d d S )Nc                 S   s   ddgS )Nrq   r   r$   r0  r$   r$   r%   badrhs  r   z&test_odeint_bad_shapes.<locals>.badrhsc                 S   r-  r.  r$   r0  r$   r$   r%   sys1  r   z$test_odeint_bad_shapes.<locals>.sys1c                 S   s
   g dgS )N)r   r   r   r$   r0  r$   r$   r%   badjac  r	  z&test_odeint_bad_shapes.<locals>.badjacr   rq   r   rp   r   rC   r=  )rj   r?  r   rk   )rA  rB  rC  bad_y0bad_tr$   r$   r%   test_odeint_bad_shapes  s    rF  c                  C   s  dd } t d}t| dg|}t|t t|df dt d }dgd	 |d| d| d
| g }t| ddg|ddd}t ddggd	 ddgddgddgddgg }t|| t| dgg }t|t jg t j	d
d ttt| dgg d ttt| g dg d dS )zRegression test for gh-8217.c                 S   r-  )Ng      пr$   r0  r$   r$   r%   r  1  r   z$test_repeated_t_values.<locals>.funcrC   rg   rq   r  r   r   	   rp   r  )rE   rD   r   r   g      ?g      ?)dtyper   )r   rq   r   r   )rq   r   rp   )r   r   r  rp   N)r   r   r   r   r!  lenlogr   r   float64reshaperj   r?  )r  r    rl   tauexpected_solr$   r$   r%   test_repeated_t_values.  s&   
"
rO  );r   numpyr   r   r   r   r   r   r   r   r	   r
   r   r   numpy.testingr   r   r   r   r   r   rw   r   rj   scipy.integrater   r   r   r   r=   rP   rz   r~   r   r   r   r   r   r   r5   r   r)   r   r   r   r   r   r   r   r   r   r  r  r  r  r,  r@  rF  rO  r$   r$   r$   r%   <module>   sL   4 ##m)ZC?B	I 