o
    iG                     @   s$  d dl 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Zd dlmZ d dlmZmZmZmZmZmZmZ d dlmZ d dlmZmZ d d	lmZ d d
lmZm 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(dd Z)dd Z*dd  Z+d!d" Z,d#d$ Z-d%d& Z.d'd( Z/d)d* Z0d+d, Z1d-d. Z2d/d0 Z3d1d2 Z4e	j5j6d3d4 Z7e	j5j6d5d6 Z8e	j59d7d8d9 Z:d:d; Z;e	j5j<e	j5=d<g d=d>d? Z>d@dA Z?dBdC Z@e	j5=dDdEdFgdGdH ZAdIdJ ZBdKdL ZCdMdN ZDdOdP ZEdQdR ZFe	j5j6dSdT ZGdUdV ZHdWdX ZIdYdZ ZJd[d\ ZKd]d^ ZLd_d` ZMdadb ZNdcdd ZOdedf ZPdgdh ZQe	j5j6didj ZRe	j5=d<g dkdldm ZSdndo ZTe	j5=dpejUejVgdqdr ZWe	j5=d<g dsdtdu ZXe	j5=d<g dsdvdw ZYe	j5=d<g dsdxdy ZZe	j5=d<g dsdzd{ Z[d|d} Z\dS )~    )product)assert_assert_allcloseassert_array_lessassert_equalassert_no_warningssuppress_warningsN)raises)group_columns)	solve_ivpRK23RK45DOP853RadauBDFLSODA)OdeSolution)num_jacselect_initial_step)ConstantDenseOutput)
coo_matrix
csc_matrixc                 C   s
   t |S N)np
zeros_likety r   ]/home/kim/smarthome/.venv/lib/python3.10/site-packages/scipy/integrate/_ivp/tests/test_ivp.pyfun_zero      
r    c                 C   s,   t |d  d|d   |d |d  gS )Nr         r   arrayr   r   r   r   
fun_linear   s   ,r&   c                   C   s   t ddgddggS )Nr#   r$   r   r   r   r   
jac_linear   s   r)   c                 C   s8   t dt d|   dt d|   t d|   fS )Nr(      )r   vstacksincosr   r   r   r   
sol_linear   s   r/   c                 C   sB   t |d |  |d |d d|d   d  | |d d   gS Nr#   r   r*   r$   r   r   r   r   fun_rational       .r1   c                 C   sB   t |d |  |d |d d|d   d  | |d d   fS r0   r   r+   r   r   r   r   fun_rational_vectorized%   r2   r4   c                 C   s^   t dd|  gd|d d  | |d d d   |d d|d   d | |d d   ggS Nr   r#   r*      r$   r   r   r   r   jac_rational*   s   
"&r8   c                 C   s\   t dd|  gd|d d  | |d d d   |d d|d   d | |d d   ggS r5   )r   r   r   r   r   jac_rational_sparse2   s   
"&r9   c                 C   s&   t | | d  d|  | d d  fS )N
   r*   )r   asarrayr.   r   r   r   sol_rational:   s   &r<   c                 C   sF  |j d d }d}d}| dkrdnd}t|d||d f}d| }t|d }d|| d d  |d  }|| d d |d  }	d| d }
d| d }d| }d| d }td| }|||
 ||   d|  |	|| d||   ||
   |d   |||  ||   |d d d< | ||  ||  |dd d< |S )	Nr   r*   d   r7   r"   r6   r#      )shaper   hstackarangeempty)r   r   nkcphidjalphabetaZj_2_p1Zj_2_m3Zj_2_m1Zj_2fr   r   r   fun_medazko>   s*   & rL   c                 C   s   g }g }t | d }||dd   ||dd  d  || || || ||d  ||d d  ||d d d  t | d d }|| || || ||d  t |}t |}tt |||ffS )Nr*   r#   r'   )r   rA   appendr@   r   	ones_like)rC   colsrowsir   r   r   medazko_sparsityY   s&   







rR   c                 C      | S r   r   r   r   r   r   fun_complexy   s   rT   c                 C   s   t |jd  S Nr   )r   eyer?   r   r   r   r   jac_complex}      rW   c                 C   s   t t| |S r   )r   rW   r   r   r   r   jac_complex_sparse   s   rY   c                 C   s   dt |   }|dS )N      ?      ?)r#   r'   )r   expZreshaper   r   r   r   sol_complex   s   
r\   c                 C   s   || d  S Nr*   r   r   r   r   r   fun_event_dense_output_LSODA      r^   c                 C      | d S r]   r   r   r   r   r   jac_event_dense_output_LSODA      ra   c                 C   s(   t | d d d|   t d d S )Nr*   皙?   )r   r[   logr.   r   r   r   sol_event_dense_output_LSODA   s   (rf   c                 C   s:   | | ||t |   }t jj|ddt |jd  S )Nr   )Zaxis)r   abslinalgnormsqrtr?   )r   y_truertolatoler   r   r   compute_error   s    ro   c                  C   s   dd } dd }d|_ d|_t| dtjgddgd	|dd
}t|dtddgddd t|jtdggddd t|j	tddgggdd |j
sOJ t|jd d S )Nc                 S   s   |d dgS )Nr#   g:#r   r   r   r   r   upward_cannon   r_   z0test_duplicate_timestamps.<locals>.upward_cannonc                 S      |d S rU   r   r   r   r   r   
hit_ground   rb   z-test_duplicate_timestamps.<locals>.hit_groundTr'   r   {Gz?g/ҟJb>)max_stepeventsdense_outputgix9g.qGh㈵>:0yE>rl   rm   gl `?        g{Gz&.>rm   r#   )terminal	directionr   r   infr   solr;   t_eventsy_eventssuccessr   status)rp   rr   r   r   r   r   test_duplicate_timestamps   s   
r   c                  C   s6  d} d}ddg}t ddgg ddd	gdd
ggd ttgD ]\}}}}|r't}nt}t }|td t|||| ||d||d	}	W d    n1 sJw   Y  t	|	j
d |d  t|	jd u  t|	jd u  t|	j t	|	jd |dkr~t|	jdk  nt|	jdk  |dv rt	|	jd t	|	jd ntd|	j  k odk n   td|	j  k odk n   t|	j
}
t|	j|
| |}tt|dk  tj| }t|}|	|}t||| |}tt|dk  |d |d  d }t|}|	|}t||| |}tt|dk  t|	|	j
|	jddd qd S )NMbP?ư>UUUUUU?qq?FTr   r   r   r   r   r   r"   	   r#   AThe following arguments have no effect for a chosen solver: `jac`)rl   rm   methodrv   jac
vectorizedr   r   2   (   )r   r   r   r   r>   r:   r'   r*   V瞯<ry   )r   r8   r9   r4   r1   r   filterUserWarningr   r   r   r   r   r   r   r   nfevnjevnlur<   ro   r   r   alllinspacer   r   )rl   rm   y0r   r   t_spanr   funsupresrk   rn   tcyc_trueycr   r   r   test_integration   sb   





r   c                  C   s  d} d}dg}ddg}t |d |d }tg dd ttgD ]\}}t }|td tt	|||d| ||d	}W d    n1 sCw   Y  t
|jd |d  t|jd u  t|jd u  t|j t
|jd |d
krw|jdk svJ n|jdk s~J |dkrt
|jd |jdk sJ n|jdksJ |jdksJ t|j}	t|j|	| |}
t |
dk sJ t|}||}t||| |}
t |
dk sJ qd S )Nr   r   rZ   r   r#   )r   r   r   r   r   T)r   rv   rl   rm   r   r   #      r   rd   r"   )r   r   r   rW   rY   r   r   r   r   rT   r   r   r   r   r   r   r   r   r   r   r\   ro   r   r   r   )rl   rm   r   r   r   r   r   r   r   rk   rn   r   r   r   r   r   test_integration_complex   sJ   



r   r"   c                  C   s6  d} ddg}t d|  }d|dd d< t| }dD ]~}tt||||d}t|jd |d  t|jd u  t|j	d u  t|j
 t|jd t|jd d	d
d t|jd ddd t|jd dd
d t|jd ddd t|jd dd
d t|jd ddd t|jd ddd t|jd dd
d qd S )N   r      r*   r#   )r   r   )r   Zjac_sparsity)N   r'   gݨ'.?rs   rl   )O   r'   r   r|   )   r'   ghen7?)   r'   )   r'   gՊ.?)   r'   ggJ	T>)   r'   )   r'   g`P^?)r   zerosrR   r   rL   r   r   r   r   r   r   r   r   r   )rC   r   r   sparsityr   r   r   r   r   "test_integration_sparse_difference  s.   

r   c                  C   s^  d} d}ddg}ddg}t  }t|}tddg||gD ]\}}tt||| ||d|d}t|jd |d  t|jd u  t|j	d u  t|j
 t|jd t|jd	k  t|jd td|j  k ogd
k n   t|j}	t|j|	| |}
tt|
dk  tj| }t|}||}t||| |}
tt|
d
k  t||j|jddd qd S )Nr   r   r   r*   r   r   T)rl   rm   r   rv   r   r=      r:   +=ry   )r)   r   r   r   r&   r   r   r   r   r   r   r   r   r   r   r/   ro   r   r   r   r   r   r   )rl   rm   r   r   JZJ_sparser   r   r   rk   rn   r   r   r   r   r   r   test_integration_const_jac8  s8   



r   r   )r   r   r   c                 C   sp   d}d}g d}ddg}| dkr|dkrt jdd d	d
 }t|||||| d}|jdk s/J |jdk s6J d S )Nr   )     @r   r   r   g    חAr   r#   z)LSODA does not allow for concurrent callsreasonc                 S   sH   |\}}}d| d| |  d| d| |  d| |  d| | gS )N{Gzr   {Gz?    8|Ar   )r   statexr   zr   r   r   fun_robertsonf  s
   

z-test_integration_stiff.<locals>.fun_robertson)rl   rm   r   i  r   )pytestskipr   r   r   )r   num_parallel_threadsrl   rm   r   Ztspanr   r   r   r   r   test_integration_stiff[  s   
r   c           
   	   C   sD
  dd }dd }dd }d|_ dD ]}|d	kr| d
krqttddgddg|||fd}t|jd t|jd jd
 t|jd
 jd
 td|jd d   k oSdk n   td|jd
 d   k ofdk n   t|jd j	d t|jd
 j	d t
||jd d |jd d dsJ t
||jd
 d |jd
 d dsJ d
|_d
|_ttddgddg|||fd}t|jd t|jd jd
 t|jd
 jd td|jd d   k odk n   t|jd j	d t|jd
 j	d t
||jd d |jd d dsJ d|_d|_ttddgddg|||fd}t|jd t|jd jd t|jd
 jd
 td|jd
 d   k oKdk n   t|jd j	d t|jd
 j	d t
||jd
 d |jd
 d dswJ d|_d|_ttddgddg||||fdd}t|jd
 t|jd jd
 t|jd
 jd t|jd jd
 td|jd d   k odk n   td|jd d   k odk n   t|jd j	d t|jd
 j	d t|jd j	d t
||jd d |jd d dsJ t
||jd d |jd d dsJ ttddgddg||dd}t|jd t|jd jd
 td|jd d   k oKdk n   t|jd j	d t
||jd d |jd d dsnJ t
|jd |jd }t|}||}t||dd}	tt
|	dk  t
jt|jd d |jd d dddsJ qd|_d|_dD ]j}|d	kr| d
krÐqttddgddg|||fd}t|jd t|jd jd
 t|jd
 jd
 td|jd d   k odk n   td|jd
 d   k odk n   t|jd j	d t|jd
 j	d t
||jd d |jd d ds:J t
||jd
 d |jd
 d dsPJ d|_d|_ttddgddg|||fd}t|jd t|jd jd
 t|jd
 jd td|jd d   k odk n   t|jd j	d t|jd
 j	d t
||jd d |jd d dsJ d
|_d
|_ttddgddg|||fd}t|jd t|jd jd t|jd
 jd
 td|jd
 d   k odk n   t|jd j	d t|jd
 j	d t
||jd
 d |jd
 d ds"J d|_d|_ttddgddg||||fdd}t|jd
 t|jd jd t|jd
 jd
 t|jd jd
 td|jd
 d   k ojdk n   td|jd d   k o~dk n   t|jd j	d t|jd
 j	d t|jd j	d t
||jd
 d |jd
 d dsJ t
||jd d |jd d dsJ t
|jd |jd }t|}||}t||dd}	tt
|	dk  t
jt|jd
 d |jd
 d dddsJ t
jt|jd d |jd d dddsJ qd S ) Nc                 S   s   |d |d d  S )Nr   r#   gffffff?r   r   r   r   r   event_rational_1w     z%test_events.<locals>.event_rational_1c                 S   s   |d d |d  S )Nr#   g333333?r   r   r   r   r   r   event_rational_2z  r   z%test_events.<locals>.event_rational_2c                 S   r`   )Ng@r   r   r   r   r   event_rational_3}  rb   z%test_events.<locals>.event_rational_3Tr   r   r#   r"      r   r   )r   ru   r   g333333@g@g333333@g@)r#   r*   r   r'   )r   ru   rv   r*         @r   r   ry   gqq?gX<ݚ?)r}   r   r1   r   r   r   sizer   r   r?   r   iscloser~   r   r   r<   r   ro   r   Zallclose)
r   r   r   r   r   r   r   r   r   rn   r   r   r   test_eventsv  s`  
&&&
(
((

(

 
((

(
(
((


  r   c                  C   s   dd } dd }| |fS )Nc                 S   s   |d |d  gS )Nr#   r   r   r   r   r   r   rK   -  rX   z#_get_harmonic_oscillator.<locals>.fc                 S   rq   rU   r   r   r   r   r   event0  rb   z'_get_harmonic_oscillator.<locals>.eventr   )rK   r   r   r   r   _get_harmonic_oscillator,  s   r   n_eventsr>   r7   c                 C   st   t  \}}| |_t|dddg|d}t|jd | ksJ t|jd | ks(J t|jd d d df ddd d S )Nr   r=   r#   r   )ru   r   r|   )r   r}   r   lenr   r   r   )r   rK   r   r   r   r   r   test_event_terminal_integer6  s   
$r   c                  C   s   t  \} }| dddgf}d |_t|d|i}d|_t|d|i}t|j|j d}d|_tjt|d t|d|i W d    n1 sEw   Y  d|_tjt|d t|d|i W d    d S 1 sgw   Y  d S )	Nr   r#   r   ru   zThe `terminal` attribute...r'   matchg      @)r   r}   r   r   r   r   r	   
ValueError)rK   r   argsr   refmessager   r   r   test_event_terminal_iv@  s    
"r   c                 C   s  d}d}ddg}t tttttfD ]}|tu r| dkrqddgddgfD ]}tt|||d||d	d
}t|j	d |d  t|j	d |d  t
ttt|j	dk t
|jd u  t
|j t|jd t|j	}t|j|||}t
t|dk  tj| }	t|	}
||	}t||
||}t
t|dk  t||j	|jddd tt|t|d ||d dd |tur|t|d ||d ||dd}| }| }t|jd t
d|v  tt|j q#qd S )Nr   r   r   r   r#   r"   r         ?T)rl   rt   rm   r   rv   r   r'   g	     ?r   ry   )rt   g#B;)rl   rm   rt   failedzstep size is less)r   r   r   r   r   r   r   r1   r   r   r   r   r   rg   diffr   r   r   r<   ro   r   r   r   r   assert_raisesr   stepRuntimeError)r   rl   rm   r   r   r   r   rk   rn   r   r   r   solverr   r   r   r   test_max_stepS  sR   
 



r   c                 C   s  d}d}ddg}d}t tttttfD ]}|tu r| dkrqddgddgfD ]}tt|||d	||d
|d	}t|j	d |d  t|j	d |d  t
|t|j	d d  t|jd u  t|j t|jd t|j	}t|j|||}	tt|	dk  tj| }
t|
}||
}t||||}	tt|	dk  t
||j	|jddd tt|t|d ||d dd tt|t|d ||d dd q%qd S )Nr   r   r   r   皙?r#   r"   r   r   T)rl   rt   rm   r   rv   
first_stepr   r'   r   ry   )r   )r   r   r   r   r   r   r   r1   r   r   r   r   rg   r   r   r   r   r<   ro   r   r   r   r   r   r   )r   rl   rm   r   r   r   r   r   rk   rn   r   r   r   r   r   r   test_first_step  sF   




r   c               
   C   sl  d} d}ddg}ddgddgfD ]E}t |d |d d	}tt||| ||d
}t|j| t|jd u  t|j t|j	d t
|j}t|j|| |}tt |dk  qg d}ttddg|| ||d
}t|j| t|jd u  t|j t|j	d t
|j}t|j|| |}tt |dk  g d}ttddg|| ||d
}t|j| t|jd u  t|j t|j	d g d}ttddg|| ||d
}t|j| t|jd u  t|j t|j	d t
|j}t|j|| |}tt |dk  g d}ttddg|| ||d
}t|j| t|jd u  t|j t|j	d ddg}ttttddg|| ||d
 d S )Nr   r   r   r   r"   r   r#   r   r:   rl   rm   t_eval)r"   
ףp=
@   r   Q @r   )r"   (\@r>         ?皙?)\(?r#   )r   r   r   r   )r   r>   r   r   r   r7   rd   )r   r   r   r1   r   r   r   r   r   r   r<   ro   r   r   r   r   )rl   rm   r   r   r   r   rk   rn   r   r   r   test_t_eval  sr   








r   c            	   	   C   s   d} d}ddg}ddg}t |d |d d	}tt||| ||d
}tt||| ||dd}t|j| t|jd u  t|j t|j	d t|j|j t|j
|j
 t|jd u  t|j t|j	d t|j}t|j
|| |}tt |dk  d S )Nr   r   r   r   r"   r   r   r#   r:   r   T)rl   rm   r   rv   )r   r   r   r1   r   r   r   r   r   r   r   r<   ro   r   )	rl   rm   r   r   r   r   Zres_drk   rn   r   r   r   test_t_eval_dense_output  s.   


r   c            	      C   s   dd } d| _ d}d}ddg}dd	g}td
d	d}dD ]a}t }|td tt||||||| td	}W d    n1 s?w   Y  |j	sIJ |j
dksPJ |jdksWJ |js]|jr_J t|jdkshJ |jd jdksrJ |jd d dks}J qd S )Nc                 S   r`   )Nr   r   r   r   r   r   early_event  rb   z,test_t_eval_early_event.<locals>.early_eventTr   r   r   r   r"   r   r      r   r   )rl   rm   r   r   ru   r   zA termination event occurred.r#   r   r   )r}   r   r   r   r   r   r   r1   r8   r   r   r   r   r   r   r   r   )	r   rl   rm   r   r   r   r   r   r   r   r   r   test_t_eval_early_event  s2   
r   c                 C   s$  | dkr	t d dd }d}d}dg}dd	g}d}tt||d
d||d||td}t|jd |d  t|jd |d  t|t	|jd |d   |j
sQJ t|jd t|j}t|j|||}	t|	d tj| }
t|
}||
}t||||}	t|	d t||j|jddd d S )Nr#   -LSODA does not allow for concurrent executionc                 S   s   |d d S )Nr   gOne.>r   r   r   r   r   event_lsoda   r_   z2test_event_dense_output_LSODA.<locals>.event_lsodar   r   rc   r6   r*   r   T)r   rv   ru   r   rt   rl   rm   r   r   r'   r"   r   ry   )r   r   r   r^   ra   r   r   r   r   rg   r   r   rf   ro   r   r   r   r   )r   r   rl   rm   r   r   r   r   rk   rn   r   r   r   r   r   r   test_event_dense_output_LSODA  sF   






r   c                  C   s`   dD ]+} t dd ddgddg| dd}t|dddg t|g d	g d
g dg qd S )Nr   c                 S   rS   r   r   r   r   r   r   <lambda>K      z%test_no_integration.<locals>.<lambda>r7   r*   r>   Tr   rv   )r7   r"   rd   r*   r*   r*   )r>   r>   r>   )r   r   r   )r   r   r   r   r   test_no_integrationI  s   "r   c                  C   s   t tttttfD ]^} | dd dddgd}|  t|jd |	 }t|dddg t|g dg dg dg | d	d dg t
j}|  t|jd |	 }t|d
g  t|g dt
d qd S )Nc                 S   rS   r   r   r   r   r   r   r   S  r   z+test_no_integration_class.<locals>.<lambda>rz   g      $@finished)r   r#   r*   r:   r:   r:   )r   r   r   c                 S   rS   r   r   r   r   r   r   r   Z  r         Y@r   r>   )r   r   r   r   r   r   r   r   r   rv   r   r   rB   )r   r   r   r   r   r   test_no_integration_classQ  s   r  c               	   C   s   dd } t d}dD ]&}tt| ddg||dd}t|dt d t|g d	t d
 qdD ]'}tt| dt jg||dd}t|dt d t|g d	t d
 q4d S )Nc                 S   s
   t dS )Nr   )r   r   r   r   r   r   r   c  r!   ztest_empty.<locals>.funr   r   r   r:   Tr   )r#   r*   r>   r  )r   r   r   r   r   r   r   )r   r   r   r   r   r   r   
test_emptyb  s   
r  c                  C   s   t ddtddg} t| dddg t| g dg dg dg t ddtg } t| dtd t| g dtd d S )	Nr   r#   r*   r   )r#   r   r*   )r#   r#   r#   r   r  )r   r   r%   r   rB   )r   r   r   r   test_ConstantDenseOutputu  s   r  c                  C   s  ddg} t tttttfD ]}|td| tj}t	|j
d t	|jd t	|jtj t	|jd t	|jd t	|j|  t|jd u  |tur[t|jdk t|jdk t	|jd nt	|jd t	|jd t	|jd tt|j | }t	|jd t	|d  t	|j
d t	|jtj t	|jd t|jdk ttt|j|   t|jdk t|jdk t|jdk t|jdk | }t|d| ddd	 qd S )
Nr   r   r"   r*   runningr#   r   r   ry   )r   r   r   r   r   r   r1   r   r   r   rC   r   t_boundr~   r   r   r   Z	step_sizer   r   r   r   r   rv   r   r   equalr   )r   clsr   r   r   r   r   r   test_classes  sB   
r	  c                  C   s8  t jg dtd} t| d | d t dg}t| d | d t dg}t| ||g}t|ddg t|ddg t|ddg t|ddg t|ddg t|d	dg t|g d
t g dg t g d} t| d | d t dg}t| d | d t dg}t| ||g}t|ddg t|ddg t|ddg t|ddg t|ddg t|ddg t|ddg t|g dt g dg t ddg} tddt dg}t| |g}t|ddg t|ddg t|ddg t|g dt g dg d S )N)r   r*   r"   Zdtyper   r#   r'   r*   r>   r"   rd   )	r   rd   r6   r   g      @g      @r"   g      @r*   )	r'   r#   r'   r'   r#   r#   r#   r#   r'   )r:   r7      r:   r7   r  )   r(   r:   r  rd   r#   r7   )r'   r#   r'   r#   r'   r#   r'   )r*   r#   r   r   )r   r%   floatr   r   r   )tss1s2r   sr   r   r   test_OdeSolution  sD   "r  c            	      C   s   dd } dd }d}t g d}|||}d}| || }t| ||||d \}}t||ddd t| |||||\}}t||ddd d S )	Nc                 S   sd   t d|d  d|d  |d   d|d  d|d  |d   d|d d   d|d d  gS )Nr   r   r   r#   r*   r   r   r3   r   r   r   r   r     s
   .ztest_num_jac.<locals>.func                 S   sV   t dd|d  d|d  gdd|d  d|d   d|d  gdd|d  dggS )	Nr   r   r*   r#   r   g     g    8Ar   r$   r   r   r   r   r     s
   $ztest_num_jac.<locals>.jacr#   )r#   r   r   rw   ry   )r   r%   ravelr   r   )	r   r   r   r   ZJ_true	thresholdrK   ZJ_numfactorr   r   r   test_num_jac  s   
r  c               	   C   s,  dd } dd }t jd d}t j|}||}t|}| d|d d d f  }t| d| |dd ||fd\}}t| d| |dd \}	}
t|	| d	d
d t|
|d	d
d t jj	dd	|d}t| d| |d|||fd\}}t| d| |d|\}	}
t|	| d	d
d t|
|d	d
d d S )Nc                 S   sT   |dd  d |d d d  }t |jd }t |d| ft d| |f S )Nr#   r>   r'   r*   )r   r   r?   r+   )r   r   rn   r   r   r   r   r     s    $z test_num_jac_sparse.<locals>.func                 S   sb   t j| | ftd}d|d< d|d< td| d D ]}d|||d |d f< qd|d< d|d< |S )Nr
  r#   )r   r   r   r#   r*   )r'   r'   )r'   r6   )r   r   intrange)rC   ArQ   r   r   r   	structure  s   z&test_num_jac_sparse.<locals>.structurer   r   rx   )r   -q=r   ry   )r   )
r   randomseedZrandnr
   r  r   r   Ztoarrayuniform)r   r  rC   r   r  groupsrK   ZJ_num_sparseZfactor_sparseZJ_num_denseZfactor_denser  r   r   r   test_num_jac_sparse  s2   



r#  c                  C   s:  dd } dd }dd }dd }d	d
 }d|_ d|_ d|_d}d}d}d}t| | d| | t| |   }	dd|	g}
d| }t| d|g|
|||gd|||fd|ddd
}|jd }|jd }|jd }t|dtj dtj g t|dtj dtj g t||g td|d d}|	|}t|d t
|| ddd t|d t||  ddd t|d dd|	 |	 t| |  d  ddd |	|}|	|}|	|}t|d t|d dd  t|d t|d  t|d t|d  t|d t|d dd  t|d |g d S )!Nc                 S   s*   |\}}}| | || || d|  gS )Nr#   r   r   womegarD   zfinalr   r   r   r   r   r   sys3   s   
 ztest_args.<locals>.sys3c           	   
   S   s>   |\}}}t d| dg|ddgdd|dd|   gg}|S )Nr   r#   r*   r$   )	r   r%  r&  rD   r'  r   r   r   r   r   r   r   sys3_jac$  s   
ztest_args.<locals>.sys3_jacc                 S   s   |\}}}|S r   r   r$  r   r   r   sys3_x0decreasing+     
z$test_args.<locals>.sys3_x0decreasingc                 S   s   |\}}}|S r   r   r$  r   r   r   sys3_y0increasing/  r+  z$test_args.<locals>.sys3_y0increasingc                 S   s   |\}}}|| S r   r   r$  r   r   r   sys3_zfinal3  s   
ztest_args.<locals>.sys3_zfinalr'   r#   Tr*   r7   r"   gGz?r   r   g|=gvIh%<=)ru   rv   r   r   r   rl   rm   r   r   g      ?g      ?   r{   r  ry   gvIh%,=r|   )r~   r}   r   r[   r   r   r   pir   r   r,   r-   r   rN   )r(  r)  r*  r,  r-  r&  rD   Ztfinalr'  Zz0Zw0tendr   Z
x0events_tZ
y0events_tZzfinalevents_tr   r%  Zx0eventsZy0eventsZzfinaleventsr   r   r   	test_args  sT   ,





 *


r1  c               	   C   s   dd } t | dddgddgd}ttj|jd d df td }tjt	d	d
) t | dddgddgd}ttj|jd d df td }W d    n1 sXw   Y  ||k scJ d S )Nc                 S   s   |d |d fS )Nr   r#   r   r   r   r   r   rK   p  s   ztest_array_rtol.<locals>.fr        ?r   r   r'   r#   zAt least one element...r   gؗҜ<)
r   r   rg   rh   ri   r   r[   r   Zwarnsr   )rK   r   Zerr1Zerr2r   r   r   test_array_rtoll  s   *,r3  r   c                 C   s`   | dkr|dkrt jdd ttddgtd| d}t|j t|j	d t
|jd	d
d d S )Nr   r#   r   r   r   r:   r>   r   r2  r   r   )r   r   r   r    r   Zonesr   r   r   r   r   r   )r   r   resultr   r   r   test_integration_zero_rhs  s   
r6  c                  C   sx   dd } d}t jt|d t| ddgdd W d    n1 s!w   Y  t| ddgd	d}t|jd
 td d S )Nc                 S   s   || S r   r   )r   r   ar   r   r   fun_with_arg  rb   z,test_args_single_value.<locals>.fun_with_argz#Supplied 'args' cannot be unpacked.r   )r   r   r#   r'   )r   )r'   r   r'   g)r   r	   	TypeErrorr   r   r   r   r[   )r8  r   r   r   r   r   test_args_single_value  s   r;  f0_fillc                 C   sP   d}t jt|d ttddgtd|  W d    d S 1 s!w   Y  d S )Nz8All components of the initial state `y0` must be finite.r   r   r:   r>   )r   r	   r   r   r    r   full)r<  msgr   r   r   test_initial_state_finiteness  s   "r?  )r   r   r   r   r   c                 C   s>   dd }t |dtdg| d}|jsJ t|jd d d S )Nc                 S   s   d| S r]   r   r   r   r   r   rK     rb   ztest_zero_interval.<locals>.f)rz   rz   r2  r4  r9  )r   r   r%   r   r   r   r   rK   r   r   r   r   test_zero_interval  s   
rA  c                    s:   d  fdd}t |d ftdg| d}|jsJ dS )zRegression test for gh-17341g-C6?c                    s   |  krt dd| S )N'Function was evaluated outside intervalr*   )r   r   ZSMALLr   r   rK     s   z/test_tbound_respected_small_interval.<locals>.frz   r#   r4  Nr   r   r%   r   r@  r   rC  r   $test_tbound_respected_small_interval  s   rE  c              
      sD   dd   fdd}t |dtddgdd	d
ddd}|js J d
S )zRegression test for gh-8848c                 S   s   d|  d|  d| d    S )Nr:   rc   r*   r   )rr   r   r   V  s   z0test_tbound_respected_larger_interval.<locals>.Vc                    sl   | dk s| dkrt d|d }|d }t| }|| }d| d | | d| |   }t||gS )Nr*   rB  r   r#   g       gɿ)r   r   r[   r%   )r   pPQrG  ZdPdrZdQdrrH  r   r   func  s   
$z3test_tbound_respected_larger_interval.<locals>.func)rI  r*   r#   rF  gQ?FNrx   rw   )r   rt   r   r   rm   rl   rD  )r   rN  r5  r   rM  r   %test_tbound_respected_larger_interval  s   
rO  c                    s0   dd  d
 fdd	}|ddd}|j sJ d	S )zRegression test for gh-9198c                 S   s"   | dkrt dtg d}|S )N   zCalled outside interval)ges='?gRr<>rz   rz   )r   r   r%   )r   r   Zyprimer   r   r   reactions_func  s   z8test_tbound_respected_oscillator.<locals>.reactions_funcr:   逖 c                    s4   t g d}d}d}t ||f| d|| dS )N)gLOѧ`@gCYZa@r   rz   r   g      i@T)rv   rt   )r   r%   r   copy)Zt_endZn_timepointsZshortest_delay_lineZ
init_statet0t1rQ  r   r   run_sim2  s   z2test_tbound_respected_oscillator.<locals>.run_sim2i  r=   N)r:   rR  )r   )r   rW  r5  r   rV  r    test_tbound_respected_oscillator  s   		rX  c            	      C   s   d} d}t ddg}dD ]E\}}tjtjtjddfD ]6}tt|||t jt||t 	|| || |
}|d }tt||||t||t 	|| || |
}t
|| qqd	S )
z0Verify that select_inital_step respects max_stepr   r   r   r   ))r"   r   )r"   r#   r>   r#   r*   N)r   r%   r   Zerror_estimator_orderr   r   r   r1   r   signr   )	rl   rm   r   rT  r  Zmethod_orderZstep_no_maxrt   Zstep_with_maxr   r   r   test_inital_maxstep  s8   

rZ  )]	itertoolsr   Znumpy.testingr   r   r   r   r   r   r   r	   r   numpyr   Zscipy.optimize._numdiffr
   Zscipy.integrater   r   r   r   r   r   r   r   Zscipy.integrate._ivp.commonr   r   Zscipy.integrate._ivp.baser   Zscipy.sparser   r   r    r&   r)   r/   r1   r4   r8   r9   r<   rL   rR   rT   rW   rY   r\   r^   ra   rf   ro   r   markZthread_unsafer   r   Z	fail_slowr   r   ZslowZparametrizer   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r	  r  r  r#  r1  r3  r6  r;  nanr   r?  rA  rE  rO  rX  rZ  r   r   r   r   <module>   s     $ 
@

,
# 7

	,'>
-
&+-S







