o
    EbN                     @   s   d dl Z zd dlmZ W n ey   d dlmZ Y nw 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mZ d dlmZmZmZmZ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+ Z*d,d- Z+d.d/ Z,d0d1 Z-d2d3 Z.d4d5 Z/d6d7 Z0d8d9 Z1d:d; Z2d<d= Z3d>d? Z4d@dA Z5dBdC Z6dDdE Z7dFdG Z8dHdI Z9dJdK Z:dLdM Z;dNdO Z<dPdQ Z=dRdS Z>dTdU Z?dVdW Z@dXdY ZAdZd[ ZBd\d] ZCd^d_ ZDd`da ZEdbdc ZFddde ZGdfdg ZHdS )h    N)StringIO)assert_assert_array_equalassert_allcloseassert_equal)raises)
coo_matrix)erf)modify_meshestimate_fun_jacestimate_bc_jaccompute_jac_indicesconstruct_global_jac	solve_bvpc                 C   s   t |d |d fS N   r   npvstackxy r   @/usr/lib/python3/dist-packages/scipy/integrate/tests/test_bvp.pyexp_fun   s   r   c                 C   s:   t dd| jd f}d|d< d|d< d|d< d|d< |S )N   r   r   r   r   r   r   r   r   r   r   r   emptyshaper   r   df_dyr   r   r   exp_fun_jac   s   r%   c                 C   s   t | d d |d fS Nr   r   r   Zhstackyaybr   r   r   exp_bc!      r+   c                 C   s   t | d d d |d fS )Nr   r   y              ?r'   r(   r   r   r   exp_bc_complex%   s   r-   c                 C   s4   t ddgddgg}t ddgddgg}||fS r   r   arrayr)   r*   dbc_dyadbc_dybr   r   r   
exp_bc_jac)      r3   c                 C   s(   t |  t | d  dt d  S )Nr   r   )r   expr   r   r   r   exp_sol5   s   (r8   c                 C   s$   t |d |d d  |d  fS )Nr   r   r   r   r   r   pr   r   r   sl_fun9      $r;   c                 C   s|   |j \}}t|d|f}d|d< d|d< |d d  |d< d|d< t|d|f}d|d< d|d  |d  |d< ||fS )	Nr   r   r   r   r   r   r   r5   )r"   r   r!   r   r   r:   nmr$   df_dpr   r   r   
sl_fun_jac=   s   
rA   c                 C   s$   t | d |d | d |d  fS r&   r'   r)   r*   r:   r   r   r   sl_bcL   r<   rC   c                 C   sH   t d}d|d< d|d< t d}d|d< t d}d|d< |||fS )	N)   r   r   r   )r   r   r   )rD   r   )r   r   r   zeros)r)   r*   r:   r1   r2   dbc_dpr   r   r   	sl_bc_jacP   s   



rI   c                 C   s   t |d |  S )Nr   )r   sinr   r:   r   r   r   sl_sol^   s   rL   c                 C   s   t |d |d d  fS )Nr   r      r   r   r   r   r   	emden_funb   s   rN   c                 C   sF   t dd| jd f}d|d< d|d< d|d d  |d< d|d	< |S )
Nr   r   r   r   r      r   r   r    r#   r   r   r   emden_fun_jacf   s   rQ   c                 C   s   t | d |d d gS )Nr   r   LXz?r.   r(   r   r   r   emden_bco   r,   rS   c                 C   s4   t ddgddgg}t ddgddgg}||fS r&   r.   r0   r   r   r   emden_bc_jacs   r4   rT   c                 C   s   d| d d  d S )Nr   r   rD         r   r7   r   r   r   	emden_sol   s   rV   c                 C   s
   t |S Nr   
zeros_liker   r   r   r   undefined_fun      
rZ   c                 C   s   t | d |d d gS r&   r.   r(   r   r   r   undefined_bc   r,   r\   c                 C   s&   t |}|dd d |d d d< |S )Nr   r   rX   )r   r   fr   r   r   big_fun   s   
r^   c                 C   s&   t | d d d |d d d d fS )Nr   r   r'   r(   r   r   r   big_bc   s   &r_   c                 C   s&   t d| | jf}| |d d d< | S )Nr   )r   onessize)r   r>   r   r   r   r   big_sol   s   rb   c                 C   sr   t |}|ddd |ddd< |d d  |ddd  |ddd< |d d  |ddd  |ddd< |S )a   Big version of sl_fun, with two parameters.

    The two differential equations represented by sl_fun are broadcast to the
    number of rows of y, rotating between the parameters p[0] and p[1].
    Here are the differential equations:

        dy[0]/dt = y[1]
        dy[1]/dt = -p[0]**2 * y[0]
        dy[2]/dt = y[3]
        dy[3]/dt = -p[1]**2 * y[2]
        dy[4]/dt = y[5]
        dy[5]/dt = -p[0]**2 * y[4]
        dy[6]/dt = y[7]
        dy[7]/dt = -p[1]**2 * y[6]
        .
        .
        .

    r   Nr   r   rP   rD   rX   )r   r   r:   r]   r   r   r   big_fun_with_parameters   s
   
&&rc   c                 C   s   |j \}}t|||f}d|td|dtd|df< |d d  |td|dtd|df< |d d  |td|dtd|df< t|d|f}d|d  |td|d  |td|ddf< d|d  |td|d  |td|ddf< ||fS )Nr   r   r   rP   rD   r5   r"   r   rG   ranger=   r   r   r   big_fun_with_parameters_jac   s   
&&,,rf   c                 C   s>   t | d d d |d d d | d |d  | d |d  fS )Nr   r   r   rD   r'   rB   r   r   r   big_bc_with_parameters   s   >rg   c                 C   s   | j d }t|d |f}t|d |f}d|t|d td|df< d|t|d |td|df< t|d df}d||df< d||df< d||d df< d||d df< |||fS )Nr   r   r   rE   rD   rd   )r)   r*   r:   r>   r1   r2   rH   r   r   r   big_bc_with_parameters_jac   s   

rh   c                 C   s*   t t |d |  t |d |  fS r&   )r   r   rJ   rK   r   r   r   big_sol_with_parameters   s   *ri   c              	   C   s\   d}t |d | |d  |t jd  t t j|    t j|  t t j|     | fS )NMbP?r   r   )r   r   picosrJ   )r   r   epsr   r   r   	shock_fun   s   (rn   c                 C   s   t | d d |d gS )Nr   r   r.   r(   r   r   r   shock_bc   r,   ro   c                 C   s:   d}t d| }t t j|  t| | td|   S )Nrj   r   r   )r   Zsqrtrl   rk   r	   )r   rm   kr   r   r   	shock_sol   s   (rq   c                 C   s   t |d t | gS )Nr   )r   stackrY   r   r   r   r   nonlin_bc_fun   s   rs   c                 C   s   | \}}|\}}d\}}}}	}
d| d }|t |
| t |
 |   }|||  }|	| d }|t |
| t |
 |   }|||  }t ||gS )N)g=
ףp=?{Gz?-C6?      ?g33333sC@              ?)r   r6   r/   )r)   r*   ZphiAZphipAZphiCZphipCZkappaZioAZioCVr]   ZhAZiAZres0ZhCZiCZres1r   r   r   nonlin_bc_bc   s   ""rz   c                 C   s   dd|   S )Ng/g)?r   r7   r   r   r   nonlin_bc_sol  s   r{   c                  C   s   t jg dtd} t| t dgt dg}t|t g d t jg dtd} t| t jdgtdt g d}t|g d	 d S )
N)r   r   rD   	   Zdtyper   r   )r   rv   r   rD   rM      r|   )r   rD      r   )r   r   rD   )r   rO   r   g      r   r   r   rD   rP   rM   r   )r   r/   floatr
   r   int)r   Zx_newr   r   r   test_modify_mesh  s   "r   c                  C   sj  t ddd} t d| jd f}d|d< d|d< t g }tdd | ||\}}t| |}t|| t|d u  t dt j	d} t d| jd f}t 
| |d< t | |d< t d	g}tt| ||\}}t| ||\}}t|| t|| t ddd
} t d| jd f}d|d< d|d< t g }tdd | ||\}}t| |}t|| t|d u  d S )Nr   r   rM   r   rt   g{Gz?c                 S   
   t | |S rW   r   r9   r   r   r   <lambda>      
 z&test_compute_fun_jac.<locals>.<lambda>rx   
   rR   ru   c                 S   r   rW   )rN   r9   r   r   r   r   4  r   )r   linspacer!   r"   r/   r   r%   r   r   rk   rJ   rl   r;   rA   rQ   )r   r   r:   r$   r@   Zdf_dy_anZdf_dp_anr   r   r   test_compute_fun_jac  s6   







r   c            	      C   sH  t ddg} t ddg}t g }tdd | ||\}}}t| |\}}t|| t|| t|d u  t ddg} t dd	g}t dg}tt| ||\}}}t| ||\}}}t|| t|| t|| t dd
g} t ddg}t g }tdd | ||\}}}t| |\}}t|| t|| t|d u  d S )Ng      r   rv   rD   c                 S   r   rW   r+   rB   r   r   r   r   ?  r   z%test_compute_bc_jac.<locals>.<lambda>rw   r   rE   d   ig      %@c                 S   r   rW   )rS   rB   r   r   r   r   R  r   )	r   r/   r   r3   r   r   rC   rI   rT   )	r)   r*   r:   r1   r2   rH   Z
dbc_dya_anZ
dbc_dyb_anZ	dbc_dp_anr   r   r   test_compute_bc_jac:  s8   










r   c                  C   s   d} d}d}t | ||\}}tt|||ff }tg dg dg dg dg dg dg dg dg dg dg
}t|| d S )Nr   rP   )
r   r   r   r   r   r   r   r   r   r   )
r   r   r   r   r   r   r   r   r   r   )
r   r   r   r   r   r   r   r   r   r   )
r   r   r   r   r   r   r   r   r   r   )r   r   r   Z	ones_liketoarrayr/   r   )r>   r?   rp   ijsZs_truer   r   r   test_compute_jac_indicesY  s$   r   c                  C   s6  d} d}d}t ddd\}}tddd}t|}tttj| tjttj|  f}tdg}t	|||}	|d d d|  }
d|d d d df |d d dd f   |d |	d d dd f |	d d d df    }t
|||\}}t
|
||\}}t|d d df |d d df |\}}}t| ||||||||||||}| }d	d
 }t||  | ||  | f}t|d D ]}||| |d |||  |d |  ||  |d |  f< q||d  d |dd df |ddd f   |d |d |  ddf< |||dd df |ddd f   |d d |dd df |ddd f     |d|d |  ddf< d|d< d|d< d|d< d|d< t||dd tt	|||\}}tt	|
||\}}tt|d d df |d d df |\}}}t| ||||||||||||}| }t||ddd d S )Nr   rM   r   r   g      @rE   rv      c              
   S   s   t | d |d  d d d|  | d  |d  d d d|  gd|  |d  | d |d  d d d|  |d  d| d |d  d  ggS )Nr      r   rU   rv   r.   )hr:   r   r   r   J_block  s   <Jz(test_compute_global_jac.<locals>.J_blockr   )r   r   )r|   r   )r   r   )r   r   绽|=rtolg:0yU>r   atol)r   r   r   Zdiffr   rJ   rk   rl   r/   r;   rA   rI   r   r   rG   re   r   r   r   rC   )r>   r?   rp   Zi_jacZj_jacr   r   r   r:   r]   Zx_middleZy_middler$   r@   Zdf_dy_middleZdf_dp_middler1   r2   rH   Jr   ZJ_truer   r   r   r   test_compute_global_jacn  sN   
,\*
<F$*,
r   c               	   C   s   g d} t d}ttttt| | t ddd} t d}ttttt| | dd }d	d }t d
| jd f}ttt||| |dgd dd }ttt||| | t 	ddgg}ttttt| ||d d S )N)r   r   rv   )r   rD   r   r   rM   )r   rP   c                 S   r   rW   r   r9   r   r   r   r     r   z+test_parameter_validation.<locals>.<lambda>c                 S   r   rW   r   rB   r   r   r   r     r   r   )r:   c                 S   s
   t dS )NrD   rF   r   r   r   r   wrong_shape_fun  r[   z2test_parameter_validation.<locals>.wrong_shape_fun)S)
r   rG   assert_raises
ValueErrorr   r   r+   r   r"   r/   )r   r   ZfunZbcr   r   r   r   r   test_parameter_validation  s   

r   c               
   C   sF  t ddd} t ddd}t d| jd f}d tfD ]}d tfD ]}}ttt| |||d}t	|j
d t|j t	|jjd ||}t|d t|dd t||}||d| }|dt |  }	t j|	d dd	d
 }
tt |
dk  tt |jdk  t||j|jddd t||jd|jddd q"qd S )Nr   r   rM   r   r   fun_jacbc_jach㈵>r   Zaxisrv   rj   r   r   )r   r   rG   r"   r%   r3   r   r   r+   r   statusr   successr   ra   solr   r8   abssumallrms_residualsr   ypr   x_testr   r   r   r   sol_testf_testrrel_resnorm_resr   r   r   test_no_params  s.   


r   c                  C   sl  t dt jd} t dt jd}t d| jd f}d tfD ]}d tfD ]}ttt	| |dg||d}t
|jd t|j t|jjdk  t|jdgd	d
 ||}t|d t|dgd	d	d t||dg}||d| }|dt |  }	t j|	d ddd }
tt |
dk  tt |jdk  t||j|jddd t||jd|jddd q$qd S )Nr   rM   r   r   rv   r:   r   r   r   r   ru   r   r   r   rj   r   )r   r   rk   r`   r"   rA   rI   r   r;   rC   r   r   r   r   r   ra   r   r:   r   rL   r   r   r   r   r   r   r   r   r   r   test_with_params  s4   

r   c                  C   s^  t ddd} t ddd}t d}d|d< d|d< t ddgdd	gg}d tfD ]}d tfD ]{}ttt| ||||d
}t	|j
d t|j t	|jjd ||}t|d t|dd t|||||  }||d| }	|	dt |  }
t j|
d ddd }tt |dk  t||j|jddd t||jd|jddd q0q*d S )Nr   r   r   g?r   )r   r   rR   ru   r5   )r   r   r   r   r   r   r   rv   rj   r   r   )r   r   r!   r/   rQ   rT   r   rN   rS   r   r   r   r   r   ra   r   r   rV   dotr   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   test_singular_term  s2   


r   c               
   C   sb  t ddd} t ddd}t jd| jd ftd}d tfD ]}d tfD ]}ttt	| |||d}t
|jd t|j ||}t|d jt|dd	 t|d jt|dd	 t||}||d| }|dt |  }	t jt |	t |	 dd
d }
tt |
dk  tt |jdk  t||j|jddd t||jd|jddd q$qd S )Nr   r   rM   r   r   r}   r   r   r   r   rv   rj   r   r   )r   r   rG   r"   complexr%   r3   r   r   r-   r   r   r   r   r   r   realr8   imagr   r   conjr   r   r   r   r   r   r   r   r   test_complex  s6   


r   c                  C   s   t ddd} t d| jf}ttt| |ddd}t|jd t	|j
  t ddd} t d| jf}ttt| |}t|jd t	|j
  d S )Nr   r   r   r   rM   )ZtolZ	max_nodes)r   r   rG   ra   r   r   r+   r   r   r   r   rZ   r\   )r   r   resr   r   r   test_failures7  s   r   c            	      C   s  d} t ddd}t d|  |jf}ttt||}t|jd t	|j
 ||}t|d t||  t||}||d| }|dt |  }t jt |t | ddd }t	t |dk  t	t |jdk  t||j|jd	d	d
 t||jd|jd	d	d
 d S )N   r   r   rM   r   r   rv   rj   r   r   )r   r   rG   ra   r   r^   r_   r   r   r   r   r   r   rb   r   r   r   r   r   r   r   r   r   )	r>   r   r   r   r   r   r   r   r   r   r   r   test_big_problemE  s    


" r   c                  C   s  d} t dt jd}t dt jd}t d|  |jf}d tfD ]}d tfD ]}ttt	||ddg||d}t
|jd t|j t|jddgd	d
 ||}td| dD ]&}t|| t|ddgd d	d	d t||d  t|ddgd d	d	d qUt||ddg}	||d|	 }
|
dt |	  }t j|d ddd }tt |dk  tt |jdk  t||j|jddd t||jd|jddd q&q d S )Nr   r   rM   r   r   rv   r   r   ru   r   rP   r   r   rj   r   )r   r   rk   r`   ra   rf   rh   r   rc   rg   r   r   r   r   r   r:   r   re   ri   r   r   r   r   r   r   r   )r>   r   r   r   r   r   r   r   Zisolr   r   r   r   r   r   r    test_big_problem_with_parameters]  s@   

r   c            	      C   s  t ddd} t ddd}t d| jf}ttt| |}t|jd t	|j
 t	|jjdk  ||}t|d t|ddd	 t||}||d| }|dt |  }t j|d dd
d }t	t |dk  t||j|jddd	 t||jd|jddd	 d S )NrE   r   rM   r   r   r   n   r   r   r   rv   rj   r   )r   r   rG   ra   r   rn   ro   r   r   r   r   r   r   r   rq   r   r   r   r   r   	r   r   r   r   r   r   r   r   r   r   r   r   test_shock_layer  s    


 r   c            	      C   s  t ddd} | }t d| jg}ttt| |}t|jd t	|j
 t	|jjdk  ||}t|d t|ddd t||}||d| }|dt |  }t j|d dd	d
 }t	t |dk  t||j|jddd t||jd|jddd d S )Nr   g?rM   r   r   r   r   r   r   rv   rj   r   )r   r   rG   ra   r   rs   rz   r   r   r   r   r   r   r   r{   r   r   r   r   r   r   r   r   r   test_nonlin_bc  s    


 r   c               	   C   s   t ddd} t d| jd f}dD ]F}tj}t t_zttt	| ||d}tj
 }W |t_n|t_w t|j |dkrCt| | |dkrNtd|v | |dkrYtd|v | qd S )	Nr   r   rM   r   )r   r   r   )verbosez	Solved inzMax residual)r   r   rG   r"   sysstdoutr   r   r   r+   getvaluer   r   )r   r   r   Z
old_stdoutr   textr   r   r   test_verbose  s$   
r   )Ir   r   ImportErrorioZnumpyr   Znumpy.testingr   r   r   r   Zpytestr   r   Zscipy.sparser   Zscipy.specialr	   Zscipy.integrate._bvpr
   r   r   r   r   r   r   r%   r+   r-   r3   r8   r;   rA   rC   rI   rL   rN   rQ   rS   rT   rV   rZ   r\   r^   r_   rb   rc   rf   rg   rh   ri   rn   ro   rq   rs   rz   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sx     			
 5!%