B
    `~                 @   s  d dl mZ d dl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 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* Z.d+d, Z/d-d. Z0d/d0 Z1ej2j3ej24d1d2d3d4gd5d6 Z5d7d8 Z6d9d: Z7d;d< Z8d=d> Z9d?d@ Z:dAdB Z;dCdD Z<dEdF Z=dGdH Z>dIdJ Z?dKdL Z@dMdN ZAdOdP ZBdQdR ZCdS )S    )product)assert_assert_allcloseassert_equalassert_no_warningssuppress_warningsN)raises)group_columns)	solve_ivpRK23RK45DOP853RadauBDFLSODA)OdeSolution)num_jac)ConstantDenseOutput)
coo_matrix
csc_matrixc             C   s,   t |d  d|d   |d |d  gS )Nr         )nparray)ty r   R/home/dcms/DCMS/lib/python3.7/site-packages/scipy/integrate/_ivp/tests/test_ivp.py
fun_linear   s    r   c               C   s   t ddgddggS )Nr   )r   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   r   r   fun_rational   s    r'   c             C   sB   t |d |  |d |d d|d   d  | |d d   fS )Nr   r   r"   )r   r#   )r   r   r   r   r   fun_rational_vectorized!   s    r(   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   r   r   jac_rational&   s    
"r+   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   r   r   r   jac_rational_sparse.   s    
"r,   c             C   s&   t | | d  d|  | d d  fS )N
   r"   )r   Zasarray)r   r   r   r   sol_rational6   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   r*   r   r)   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$    B  r>   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   r3   appendr2   r   	ones_like)r5   colsrowsir   r   r   medazko_sparsityU   s&    







rD   c             C   s   | S )Nr   )r   r   r   r   r   fun_complexu   s    rE   c             C   s   t |jd  S )Nr   )r   Zeyer1   )r   r   r   r   r   jac_complexy   s    rF   c             C   s   t t| |S )N)r   rF   )r   r   r   r   r   jac_complex_sparse}   s    rG   c             C   s   dt |   }|dS )Ny      ?      ?)r   r   )r   expZreshape)r   r   r   r   r   sol_complex   s    rI   c             C   s:   | | ||t |   }t jj|ddt |jd  S )Nr   )Zaxis)r   absZlinalgZnormsqrtr1   )r   y_truertolatoler   r   r   compute_error   s    rP   c              C   s@  d} d}ddg}x(t ddgddd	d
ddgddgddggd ttgD ]\}}}}|r\t}nt}t ,}|td t|||| ||d||d	}	W d Q R X t	|	j
d |d  t|	jd k t|	jd k t|	j t	|	jd |d	krt|	jdk  nt|	jdk  |dkr(t	|	jd t	|	jd n@td|	j  k o@dk n   td|	j  k o`d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  |dkrDt|	|	j
|	jddd qDW d S )NgMbP?gư>gUUUUUU?gqq?FTr   r   r   r   r   r   r   	   r   zAThe following arguments have no effect for a chosen solver: `jac`)rM   rN   methoddense_outputjac
vectorizedr   2   (   )r   r   r   r   r0   r-   r   r"   gV瞯<)rM   rN   )r   r+   r,   r(   r'   r   filterUserWarningr
   r   r   r   t_eventsy_eventssuccessstatusnfevnjevnlur.   rP   r   r   alllinspacesolr   )rM   rN   y0rU   rR   t_spanrT   funsupresrL   rO   tcyc_trueycr   r   r   test_integration   sZ    


  



rl   c              C   s  d} d}dg}ddg}t |d |d }xptdddd	gd ttgD ]R\}}t *}|td
 tt	|||d| ||d}W d Q R X t
|jd |d  t|jd k t|jd k t|j t
|jd |dkr|jdk stn|jdk st|d	krt
|jd |jdk s:tn |jdks*t|jdks:tt|j}	t|j|	| |}
t |
dk shtt|}||}t||| |}
t |
dk sFtqFW d S )NgMbP?gư>y      ?      ?r   r   r   r   r   r   zAThe following arguments have no effect for a chosen solver: `jac`T)rR   rS   rM   rN   rT   #         r   )r   rb   r   rF   rG   r   rX   rY   r
   rE   r   r   r   rZ   r[   r\   r]   r^   AssertionErrorr_   r`   rI   rP   r   ra   rc   )rM   rN   rd   re   ri   rR   rT   rg   rh   rL   rO   rj   rk   r   r   r   test_integration_complex   s@    




rq   c              C   s<  d} ddg}t d|  }d|dd d< t| }xdD ]}tt||||d}t|jd |d  t|jd k t|j	d k 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 q8W d S )N   r      r"   r   )r   r   )rR   Zjac_sparsity)N   r   gݨ'.?g{Gz?)rM   )O   r   gMbP?)rN   )   r   ghen7?)   r   )   r   gՊ.?)   r   ggJ	T>)   r   )   r   g`P^?)r   zerosrD   r
   r>   r   r   r   rZ   r[   r\   r]   r   r   )r5   re   rd   sparsityrR   rh   r   r   r   "test_integration_sparse_difference   s*    

r~   c              C   sf  d} d}ddg}ddg}t  }t|}x8tddg||gD ] \}}tt||| ||d|d}t|jd |d  t|jd k t|j	d k t|j
 t|jd t|jd	k  t|jd td|j  k od
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<W d S )NgMbP?gư>r   r"   r   r   T)rM   rN   rR   rS   rT   r/      r-   g+=)rM   rN   )r!   r   r   r
   r   r   r   r   rZ   r[   r\   r]   r^   r_   r`   r&   rP   r   r   ra   rb   rc   r   )rM   rN   rd   re   JZJ_sparserR   rT   rh   rL   rO   ri   rj   rk   r   r   r   test_integration_const_jac  s4     



r   rR   r   r   r   c             C   sV   d}d}dddg}ddg}dd }t |||||| d}|jdk sDt|jd	k sRtd S )
Ngư>g     @r   g    חAc             S   sH   |\}}}d| d| |  d| d| |  d| |  d| | gS )Ng{Gzg     @g{Gz?g    8|Ar   )r   statexr   zr   r   r   fun_robertsonA  s    
z-test_integration_stiff.<locals>.fun_robertson)rM   rN   rR   i  rr   )r
   r^   rp   r_   )rR   rM   rN   rd   Ztspanr   rh   r   r   r   test_integration_stiff9  s    


r   c        	   	   C   s*
  dd } dd }dd }d|_ x.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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tt
||jd d |jd d dsBt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t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st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 ovd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tt
||jd d |jd d ds4tttd	d
gddg|| dd}t|jd t|jd jd td|jd d   k odk n   t|jd j	d t
| |jd d |jd d dst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&tq&W d| _d|_xd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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sXtt
||jd d |jd d dst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sVt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(t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	sJtt
||jd d |jd d d	svt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	stt
jt|jd d |jd d dddsdtqdW d S )Nc             S   s   |d |d d  S )Nr   r   gffffff?r   )r   r   r   r   r   event_rational_1R  s    z%test_events.<locals>.event_rational_1c             S   s   |d d |d  S )Nr   g333333?r   r   )r   r   r   r   r   event_rational_2U  s    z%test_events.<locals>.event_rational_2c             S   s   | d S )Ng@r   )r   r   r   r   r   event_rational_3X  s    z%test_events.<locals>.event_rational_3T)r   r   r   r   r   r   r      gUUUUUU?gqq?)rR   eventsr   r   g333333@g@g333333@g@)r   r"   )r   r   )rR   r   rS   r"   g      @gMbP?gư>)rM   rN   gqq?gX<ݚ?)terminalr
   r'   r   r]   rZ   sizer   r[   r1   r   iscloserp   	directionrb   r   r.   rc   rP   ra   Zallclose)	r   r   r   rR   rh   ri   rj   rk   rO   r   r   r   test_eventsQ  s   &&((((((((((
((
2((((((((((((
0r   c              C   s  d} d}ddg}xt tttttgD ]}xd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 k t
|j t|jd t|j	}t|j|| |}t
t|dk  tj| }t|}	||}
t|
|	| |}t
t|dk  |tk	rTt||j	|jddd tt|t|d ||d dd |tk	r>|t|d ||d | |dd}| }t|jd t
d|k tt|j q>W q$W d S )NgMbP?gư>gUUUUUU?gqq?r   rQ   r   g      ?T)rM   max_steprN   rR   rS   r   r   g	     ?gV瞯<)rM   rN   )r   g#B;)rM   rN   r   failedzstep size is less)r   r   r   r   r   r   r
   r'   r   r   r   r   ra   rJ   ZdiffrZ   r\   r]   r.   rP   r   rb   rc   r   assert_raises
ValueErrorstepRuntimeError)rM   rN   rd   rR   re   rh   rL   rO   ri   rj   rk   solvermessager   r   r   test_max_step  sB    
 




r   c              C   s  d} d}ddg}d}xt tttttgD ]j}xbddgddgfD ]L}tt||| d	||d
|d	}t|j	d |d  t|j	d |d  t
|t|j	d d  t|jd k t|j t|jd t|j	}t|j|| |}tt|dk  tj| }	t|	}
||	}t||
| |}tt|dk  |tk	rTt
||j	|jddd tt|t|d ||d dd tt|t|d ||d dd qBW q(W d S )NgMbP?gư>gUUUUUU?gqq?g?r   rQ   r   g      ?T)rM   r   rN   rR   rS   
first_stepr   r   gV瞯<)rM   rN   )r   )r   r   r   r   r   r   r
   r'   r   r   r   r   rJ   r   rZ   r\   r]   r.   rP   r   ra   rb   rc   r   r   )rM   rN   rd   r   rR   re   rh   rL   rO   ri   rj   rk   r   r   r   test_first_step*  s:    






r   c           
   C   s  d} d}ddg}xddgddgfD ]}t |d |d d	}tt||| ||d
}t|j| t|jd k t|j t|j	d t
|j}t|j|| |}tt |dk  q"W ddddddg}ttddg|| ||d
}t|j| t|jd k t|j t|j	d t
|j}t|j|| |}tt |dk  dddddddg}ttddg|| ||d
}t|j| t|jd k t|j t|j	d ddddg}ttddg|| ||d
}t|j| t|jd k t|j t|j	d t
|j}t|j|| |}tt |dk  dddddg}ttddg|| ||d
}t|j| t|jd k t|j t|j	d ddg}ttttddg|| ||d
 d S )NgMbP?gư>gUUUUUU?gqq?r   rQ   r   r   r-   )rM   rN   t_evalg
ףp=
@   r   gQ @g(\@r0   g      ?g?g)\(?r*   ro   )r   rb   r
   r'   r   r   r   rZ   r\   r]   r.   rP   r   ra   r   r   )rM   rN   rd   re   r   rh   rL   rO   r   r   r   test_t_evalQ  sf    







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 k t|j t|j	d t|j|j t|j
|j
 t|jd k t|j t|j	d t|j}t|j
|| |}tt |dk  d S )NgMbP?gư>gUUUUUU?gqq?r   rQ   r   r   r-   )rM   rN   r   T)rM   rN   r   rS   )r   rb   r
   r'   r   r   r   rZ   r\   r]   r   r.   rP   ra   )	rM   rN   rd   re   r   rh   Zres_drL   rO   r   r   r   test_t_eval_dense_output  s*    



r   c              C   sj   xddD ]\} t dd ddgddg| dd}t|dddg t|dd	d
gdddgdddgg qW d S )N)r   r   r   r   r   r   c             S   s   | S )Nr   )r   r   r   r   r   <lambda>      z%test_no_integration.<locals>.<lambda>r*   r"   r0   T)rR   rS   r   ro   )r
   r   rc   )rR   rc   r   r   r   test_no_integration  s
    

r   c              C   s   xt tttttgD ]} | dd dddgd}|  t|jd |	 }t|dddg t|dddgd	d	d	gdddgg | d
d dg t
j}|  t|jd |	 }t|dg  t|dddgt
d qW d S )Nc             S   s   | S )Nr   )r   r   r   r   r   r     r   z+test_no_integration_class.<locals>.<lambda>g        g      $@finishedr   r   r"   r-   c             S   s   | S )Nr   )r   r   r   r   r   r     r   g      Y@)r   r0   )r   r   r   r   r   r   r   r   r]   rS   r   infr4   )rR   r   rc   r   r   r   test_no_integration_class  s    $r   c           	   C   s   dd } t d}xVdD ]N}tt| ddg||dd}t|dt d t|d	d
dgt d qW xXdD ]P}tt| dt jg||dd}t|dt d t|d	d
dgt d qpW d S )Nc             S   s
   t dS )N)r   )r   r|   )r   r   r   r   r   rf     s    ztest_empty.<locals>.fun)r   )r   r   r   r   r   r   r   r-   T)rR   rS   r   r"   r0   )r   r0   )r   r|   r   r
   r   rc   r   )rf   rd   rR   rc   r   r   r   
test_empty  s    


 

r   c              C   s   t ddtddg} t| dddg t| dddgdddgdddgg t ddtg } t| dtd t| dddgtd d S )Nr   r   r"   g      ?)r   r0   )r   r   r   r   r4   )rc   r   r   r   test_ConstantDenseOutput  s    $r   c              C   s  ddg} xt tttttg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 k |tk	rt|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W d S )
NgUUUUUU?gqq?r   r"   Zrunningr   r   gV瞯<)rM   rN   )r   r   r   r   r   r   r'   r   r   r   r5   r]   Zt_boundr   r   r   r   Z	step_sizer^   r_   r`   r   r   rS   r   ra   equalr   )rd   clsr   r   rc   r   r   r   test_classes  s@    
r   c              C   sp  t jdddg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|ddd	d
dddddg	t dddddddddg	g t dddg} 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|dddddddgt dddddddg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|dddgt dddgg d S )Nr   r"   r   )dtyper   r   r0   ro   r)   g      ?g      @g      @g      @r-   r*         r    )r   r   floatr   r   r   )tss1s2rc   sr   r   r   test_OdeSolution  s@     r   c        	      C   s   dd } dd }d}t dddg}|||}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 )Ng{Gzr   g     @r   r"   g{Gz?g    8|A)r   r#   )r   r   r   r   r   rf   2  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 )	Ng{Gzg     @r"   r   g{Gz?g     g    8Ar   )r   r   )r   r   r   r   r   rT   9  s    $ztest_num_jac.<locals>.jacr   r   gh㈵>)rM   rN   )r   r   ravelr   r   )	rf   rT   r   r   ZJ_true	thresholdr=   ZJ_numfactorr   r   r   test_num_jac1  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   r0   r   r"   )r   r|   r1   r#   )r   r   rO   r   r   r   r   rf   N  s     z test_num_jac_sparse.<locals>.func             S   sf   t j| | ftd}d|d< d|d< x.td| d D ]}d|||d |d f< q2W d|d< d|d< |S )N)r   r   )r   r   )r   r   r"   )r   r   )r   r)   )r   r|   intrange)r5   ArC   r   r   r   	structureS  s    z&test_num_jac_sparse.<locals>.structurer   rs   g:0yE>)r}   g-q=g+=)rM   rN   )r   )
r   randomseedZrandnr	   r   r   r   Ztoarrayuniform)rf   r   r5   r   r   groupsr=   ZJ_num_sparseZfactor_sparseZJ_num_denseZfactor_denser   r   r   r   test_num_jac_sparseM  s*    



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omegar6   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   r   r6   r   r   r   r   r   r   r   r   sys3_jac  s
    
ztest_args.<locals>.sys3_jacc             S   s   |\}}}|S )Nr   )r   r   r   r6   r   r   r   r   r   r   r   sys3_x0decreasing  s    
z$test_args.<locals>.sys3_x0decreasingc             S   s   |\}}}|S )Nr   )r   r   r   r6   r   r   r   r   r   r   r   sys3_y0increasing  s    
z$test_args.<locals>.sys3_y0increasingc             S   s   |\}}}|| S )Nr   )r   r   r   r6   r   r   r   r   r   r   r   sys3_zfinal  s    
ztest_args.<locals>.sys3_zfinalr   r   Tr"   r*   r   gGz?r   r   g|=gvIh%<=)r   rS   argsrR   rT   rM   rN   g      ?g      ?g      ?g      ?   g&.>g-q=)rM   rN   gvIh%,=)rN   )r   r   r   rH   r
   rZ   r   pirb   rc   r$   r%   Z
zeros_liker@   )r   r   r   r   r   r   r6   Ztfinalr   Zz0Zw0tendrc   Z
x0events_tZ
y0events_tZzfinalevents_tr   r   Zx0eventsZy0eventsZzfinaleventsr   r   r   	test_argsz  sP    ,






 *



r   )D	itertoolsr   Znumpy.testingr   r   r   r   r   Zpytestr   r   numpyr   Zscipy.optimize._numdiffr	   Zscipy.integrater
   r   r   r   r   r   r   r   Zscipy.integrate._ivp.commonr   Zscipy.integrate._ivp.baser   Zscipy.sparser   r   r   r!   r&   r'   r(   r+   r,   r.   r>   rD   rE   rF   rG   rI   rP   rl   rq   r~   r   markZslowZparametrizer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s\   $ D,# .,'>
&+-