o
    `^hN                     @   s0  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l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 ZGejHjIdfdg ZJd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   \/home/air/shanriGPT/back/venv/lib/python3.10/site-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   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+      r4   c                 C   s(   t |  t | d  dt d  S )Nr   r   )r   expr   r   r   r   exp_sol7   s   (r9   c                 C   s$   t |d |d d  |d  fS )Nr   r   r   r   r   r   pr   r   r   sl_fun;      $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   r6   )r"   r   r!   r   r   r;   nmr$   df_dpr   r   r   
sl_fun_jac?   s   
rB   c                 C   s$   t | d |d | d |d  fS r&   r'   r*   r+   r;   r   r   r   sl_bcN   r=   rD   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   )rE   r   )r   r   r   zeros)r*   r+   r;   r2   r3   dbc_dpr   r   r   	sl_bc_jacR   s   



rJ   c                 C   s   t |d |  S )Nr   )r   sinr   r;   r   r   r   sl_sol`   s   rM   c                 C   s   t |d |d d  fS )Nr   r      r   r   r   r   r   	emden_fund   s   rO   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_jach   s   rR   c                 C   s   t | d |d d gS )Nr   r   LXz?r/   r)   r   r   r   emden_bcq   r-   rT   c                 C   s4   t ddgddgg}t ddgddgg}||fS r&   r/   r1   r   r   r   emden_bc_jacu   r5   rU   c                 C   s   d| d d  d S )Nr   r   rE         r   r8   r   r   r   	emden_sol   s   rW   c                 C   s
   t |S Nr   
zeros_liker   r   r   r   undefined_fun      
r[   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   rY   )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   rc   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   rQ   rE   rY   )r   r   r;   r^   r   r   r   big_fun_with_parameters   s
   
&&rd   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   rQ   rE   r6   r"   r   rH   ranger>   r   r   r   big_fun_with_parameters_jac   s   
&&,,rg   c                 C   s>   t | d d d |d d d | d |d  | d |d  fS )Nr   r   r   rE   r'   rC   r   r   r   big_bc_with_parameters   s   >rh   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   rF   rE   re   )r*   r+   r;   r?   r2   r3   rI   r   r   r   big_bc_with_parameters_jac   s   

ri   c                 C   s*   t t |d |  t |d |  fS r&   )r   r   rK   rL   r   r   r   big_sol_with_parameters   s   *rj   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cosrK   )r   r   epsr   r   r   	shock_fun   s   (ro   c                 C   s   t | d d |d gS )Nr   r   r/   r)   r   r   r   shock_bc   r-   rp   c                 C   s:   d}t d| }t t j|  t| | td|   S )Nrk   r   r   )r   sqrtrm   rl   r	   )r   rn   kr   r   r   	shock_sol   s   (rs   c                 C   s   t |d t | gS )Nr   )r   stackrZ   r   r   r   r   nonlin_bc_fun   s   ru   c                 C   s   | \}}|\}}d\}}}}	}
d| d }|t |
| t |
 |   }|||  }|	| d }|t |
| t |
 |   }|||  }t ||gS )N)g=
ףp=?{Gz?-C6?      ?g33333sC@              ?)r   r7   r0   )r*   r+   phiAphipAphiCphipCkappaioAioCVr^   hAiAres0hCiCres1r   r   r   nonlin_bc_bc   s   ""r   c                 C   s   dd|   S )Ng/g)?r   r8   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   rE   	   dtyper   r   )r   rx   r   rE   rN      r   )r   rE      r   )r   r   rE   )r   rP   r   g      r   r   r   rE   rQ   rN   r   )r   r0   floatr
   r   int)r   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   rN   r   rv   g{Gz?c                 S   
   t | |S rX   r   r:   r   r   r   <lambda>"     
 z&test_compute_fun_jac.<locals>.<lambda>rz   
   rS   rw   c                 S   r   rX   )rO   r:   r   r   r   r   6  r   )r   linspacer!   r"   r0   r   r%   r   r   rl   rK   rm   r<   rB   rR   )r   r   r;   r$   rA   df_dy_an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   rx   rE   c                 S   r   rX   r,   rC   r   r   r   r   A  r   z%test_compute_bc_jac.<locals>.<lambda>ry   r   rF   d   ig      %@c                 S   r   rX   )rT   rC   r   r   r   r   T  r   )	r   r0   r   r4   r   r   rD   rJ   rU   )	r*   r+   r;   r2   r3   rI   
dbc_dya_an
dbc_dyb_an	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   rQ   )
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   	ones_liketoarrayr0   r   )r?   r@   rr   ijss_truer   r   r   test_compute_jac_indices[  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   rN   r   r   g      @rF   rx      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   rV   rx   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   diffr   rK   rl   rm   r0   r<   rB   rJ   r   r   rH   rf   r   r   r   rD   )r?   r@   rr   i_jacj_jacr   r   r   r;   r^   x_middley_middler$   rA   df_dy_middledf_dp_middler2   r3   rI   Jr   J_truer   r   r   r   test_compute_global_jacp  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   rx   )r   rE   r   r   rN   )r   rQ   c                 S   r   rX   r   r:   r   r   r   fun  r\   z&test_parameter_validation.<locals>.func                 S   r   rX   r   rC   r   r   r   bc  r\   z%test_parameter_validation.<locals>.bcr   )r;   c                 S   s
   t dS )NrE   rG   r   r   r   r   wrong_shape_fun  r\   z2test_parameter_validation.<locals>.wrong_shape_fun)S)
r   rH   assert_raises
ValueErrorr   r   r,   r   r"   r0   )r   r   r   r   r   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   rN   r   r   fun_jacbc_jach㈵>r   axisrx   rk   r   r   )r   r   rH   r"   r%   r4   r   r   r,   r   statusr   successr   rb   solr   r9   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   rN   r   r   rx   r;   r   r   r   r   rw   r   r   r   rk   r   )r   r   rl   ra   r"   rB   rJ   r   r<   rD   r   r   r   r   r   rb   r   r;   r   rM   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   rS   rw   r6   )r   r   r   r   r   r   r   rx   rk   r   r   )r   r   r!   r0   rR   rU   r   rO   rT   r   r   r   r   r   rb   r   r   rW   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   rN   r   r   r   r   r   r   r   rx   rk   r   r   )r   r   rH   r"   complexr%   r4   r   r   r.   r   r   r   r   r   r   realr9   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   rN   )tol	max_nodes)r   r   rH   rb   r   r   r,   r   r   r   r   r[   r]   )r   r   resr   r   r   test_failures;  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   rN   r   r   rx   rk   r   r   )r   r   rH   rb   r   r_   r`   r   r   r   r   r   r   rc   r   r   r   r   r   r   r   r   r   )	r?   r   r   r   r   r   r   r   r   r   r   r   test_big_problemI  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   rN   r   r   rx   r   r   rw   r   rQ   r   r   rk   r   )r   r   rl   ra   rb   rg   ri   r   rd   rh   r   r   r   r   r   r;   r   rf   rj   r   r   r   r   r   r   r   )r?   r   r   r   r   r   r   r   isolr   r   r   r   r   r   r    test_big_problem_with_parametersa  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 )NrF   r   rN   r   r   r   n   r   r   r   rx   rk   r   )r   r   rH   rb   r   ro   rp   r   r   r   r   r   r   r   rs   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?rN   r   r   r   r   r   r   rx   rk   r   )r   r   rH   rb   r   ru   r   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   rN   r   )r   r   r   )verbosez	Solved inzMax residual)r   r   rH   r"   sysstdoutr   r   r   r,   getvaluer   r   )r   r   r   
old_stdoutr   textr   r   r   test_verbose  s$   
r   )Kr   r   ImportErrorionumpyr   numpy.testingr   r   r   r   pytestr   r   scipy.sparser   scipy.specialr	   scipy.integrate._bvpr
   r   r   r   r   r   r   r%   r,   r.   r4   r9   r<   rB   rD   rJ   rM   rO   rR   rT   rU   rW   r[   r]   r_   r`   rc   rd   rg   rh   ri   rj   ro   rp   rs   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   markthread_unsafer   r   r   r   r   <module>   s|     			
 5!%