U
    Gvf;                     @   s   d dl Z d dlZd dlmZmZmZ d dl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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  G dd dZ!G d	d
 d
Z"G dd dZ#G dd dZ$G dd dZ%dS )    Ncossinpi)assert_equalassert_almost_equalassert_allcloseassert_suppress_warnings)
quadraturerombergrombnewton_cotescumulative_trapezoidcumtrapztrapz	trapezoidquadsimpsonsimps
fixed_quadAccuracyWarning)	_qmc_quad)statsspecialc                   @   s   e Zd Zdd Zdd ZdS )TestFixedQuadc                    s>   d dd   }t  fdddd d\}}t||dd	 d S )
N         c                    s   | d  d  S )Nr   r    xnr   I/tmp/pip-unpacked-wheel-96ln3f52/scipy/integrate/tests/test_quadrature.py<lambda>       z+TestFixedQuad.test_scalar.<locals>.<lambda>r   r"   -q=rtol)r   r   )selfexpectedgot_r   r"   r$   test_scalar   s    zTestFixedQuad.test_scalarc                    sN   d}t dd|  d d  }t fdddd|d\}}t||dd	 d S )
Nr   r   r   c                    s   |  d d d f  S Nr   r    pr   r$   r%      r&   z+TestFixedQuad.test_vector.<locals>.<lambda>r   r"   r'   r(   )nparanger   r   )r*   r#   r+   r,   r-   r   r0   r$   test_vector   s
    zTestFixedQuad.test_vectorN)__name__
__module____qualname__r.   r4   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	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ejdddgdd Zd d! Zd"S )#TestQuadraturec                 C   s   t d S r/   )NotImplementedError)r*   r!   abargsr   r   r$   r      s    zTestQuadrature.quadc                 C   s0   dd }t |dtd\}}d}t||dd d S )Nc                 S   s   t ||  |t|   t S r/   r   r!   r#   zr   r   r$   myfunc$   s    z.TestQuadrature.test_quadrature.<locals>.myfuncr   r   ?ۗ?   decimal)r   r   r   r*   r?   valerr	table_valr   r   r$   test_quadrature"   s    zTestQuadrature.test_quadraturec                 C   s4   dd }t |dtddd\}}d}t||dd d S )Nc                 S   s    dt ||  |t|    t S )NY)	kRr   r=   r   r   r$   r?   +   s    z3TestQuadrature.test_quadrature_rtol.<locals>.myfuncr   r@   绽|=r(   .<Rr   r   r   rF   r   r   r$   test_quadrature_rtol*   s    z#TestQuadrature.test_quadrature_rtolc                 C   sJ   dd }d}dD ]4}t |dtd|d\}}t||dd	 t|d
k  qd S )Nc                 S   s   t ||  |t|   t S r/   r   r=   r   r   r$   r?   3   s    z6TestQuadrature.test_quadrature_miniter.<locals>.myfuncrB   )   4   r   r@   )miniterrC   rD         ?)r   r   r   r	   )r*   r?   rI   rR   rG   rH   r   r   r$   test_quadrature_miniter1   s    z&TestQuadrature.test_quadrature_miniterc                 C   s4   dd }t |dtddd\}}d}t||dd d S )	Nc                 S   s    dt ||  dt|    t S )NrK   rA   r   )r!   r#   r   r   r$   r?   <   s    z:TestQuadrature.test_quadrature_single_args.<locals>.myfuncr   r   rL   r<   r)   rM   r(   rN   rF   r   r   r$   test_quadrature_single_args;   s    z*TestQuadrature.test_quadrature_single_argsc                 C   s.   dd }t |dtdd}d}t||dd d S )	Nc                 S   s   t ||  |t|   t S r/   r   r=   r   r   r$   r?   D   s    z+TestQuadrature.test_romberg.<locals>.myfuncr   r@   r<   rB   rC   rD   )r   r   r   r*   r?   rG   rI   r   r   r$   test_rombergB   s    zTestQuadrature.test_rombergc                 C   s0   dd }t |dtddd}d}t||dd d S )	Nc                 S   s    dt ||  |t|    t S )Ng =`XCr   r=   r   r   r$   r?   L   s    z0TestQuadrature.test_romberg_rtol.<locals>.myfuncr   r@   rL   rU   g3>Cr(   )r   r   r   rX   r   r   r$   test_romberg_rtolJ   s    z TestQuadrature.test_romberg_rtolc                 C   s   t ttdd d S )N      )r   r   r2   r3   )r*   r   r   r$   	test_rombR   s    zTestQuadrature.test_rombc              	   C   s   t d}t d| }t|}tdd | | \}}t||ddd t .}|	t
d td	d | | d
d}W 5 Q R X t||ddd d S )Nr[   皙?c                 S   s   t d|  S Nr^   r2   r   r    r   r   r$   r%   Z   r&   z2TestQuadrature.test_romb_gh_3731.<locals>.<lambda>g:0yE>r   )r)   atolzdivmax .4. exceededc                 S   s   t d|  S r_   r`   r    r   r   r$   r%   `   r&   r   )Zdivmaxr'   )r2   r3   r   r   r   minmaxr   r
   filterr   r   )r*   r!   yrG   Zval2rH   supZval3r   r   r$   test_romb_gh_3731U   s    
&z TestQuadrature.test_romb_gh_3731c                 C   s,   dd l }t|jdd}d}t||dd d S )Nr   r   g?k?rC   rD   )mathr   r   r   )r*   rh   ZvalmathZexpected_valr   r   r$   test_non_dtypec   s    zTestQuadrature.test_non_dtypec              
   C   s  d}t |d\}}t||tddg  t||d  d  d}t |d\}}t||tdddg d  t||d	  d
  d}t |d\}}t||tddddg d  t||d	  d  d}t |d\}}t||tdddddg d  t||d  d  dS )z5Test the first few degrees, for evenly spaced points.r         ?         (@r   rS         @      @rP   g     @      @       @g     P@r         @g      @@g     V@rC   g     =AN)r   r   r2   arrayr   )r*   r#   wtserrcoffr   r   r$   test_newton_cotesj   s      "z TestQuadrature.test_newton_cotesc                 C   s   t dddg}|d }t|\}}d}t ||}t|| t ddddg}|d }t|\}}d	}t ||}t|| d
S )z9Test newton_cotes with points that are not evenly spaced.        g      ?       @r   gUUUUUU@gffffff?g @ro         "@N)r2   rr   r   dotr   )r*   r!   re   rs   rt   Zexact_integralZnumeric_integralr   r   r$   test_newton_cotes2   s    
z!TestQuadrature.test_newton_cotes2c                 C   s  t d}tt|d tt|ddd tt|t ddddd	 t d}d
| }tt||ddd tt||ddd tt||ddd t dg}t |d
}tt||ddd tt||ddd t ddddg}t |d
}tt||ddd tt||ddd t dd
ddgdd
ddgdd
ddgg}t |d
}ddddg}dddg}tt||dd| tt||dd| t dd
ddgdd
ddgdddd	gg}t |d
}ddddg}dddg}tt||dd| tt||dd| d S )Nr[   r\   rj   dx@   r   r   r        r   avg)r!   eveng     +@firstg     +@last   rk   )r!   axisrv   r      g     e@   g      a@g      @g      @g     @)r2   r3   r   r   linspacerr   power)r*   re   r!   Z	zero_axisZdefault_axisr   r   r$   test_simpson   s:    

(
(
zTestQuadrature.test_simpsondroplastFTc                 C   sx   t ddddddddgddddddddgg}|rF|d d d d	f }t|d	d
}tt j|t jdd	d
}t|| d S )Nr   r   r   rP   
      r   )r   )Zdtype)r2   rr   r   Zfloat64r   )r*   r   re   resultr+   r   r   r$   test_simpson_2d_integer_no_x   s    z+TestQuadrature.test_simpson_2d_integer_no_xc                 C   s8   t d}d| }tt||dddt||ddd d S )Nr   r   rj   r   )r!   r|   r   )r2   r3   r   r   r   r*   re   r!   r   r   r$   
test_simps   s
    
zTestQuadrature.test_simpsN)r5   r6   r7   r   rJ   rO   rT   rV   rY   rZ   r]   rg   ri   ru   rz   r   pytestmarkparametrizer   r   r   r   r   r$   r8      s    
%
r8   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestCumulative_trapezoidc                 C   s^   t jdddd}|}t||dd}ddd	ddg}t|| t||d d}t||d
d   d S )Nr   r   rP   numr   initialrv                r   r2   r   r   r   )r*   r!   re   y_int
y_expectedr   r   r$   test_1d   s    
z TestCumulative_trapezoid.test_1dc              	   C   s   t dddd}|}t||dd}t ddd	d
gdd
ddggddddgddddggddddgddddggg}t|| dddg}tdddg|D ]@\}}t||d|d}t|jd t||d |d}t|j| qd S )N   rk   r   r   r   r   rv   rj   rw         @      $@     0@      !@      2@g     <@      )@g      :@g     @D@g      A@g     @J@     4@g      E@g      P@)r   r   r   )rk   r   r   )rk   r   rk   r   g@)r   r   )rk   r   r   )	r2   r3   reshaper   rr   r   zipr   shape)r*   r!   re   r   r   Zshapesr   r   r   r   r$   test_y_nd_x_nd   s(    






z'TestCumulative_trapezoid.test_y_nd_x_ndc              
   C   s
  t dddd}t dd }t ddddgd	d
ddggddddgddddgggt ddddggddddggddddgggt dddgddd ggd!d"d#gd$d%d&ggd'd(d)gd*d+d,gggf}td-d.dg|D ]0\}}t||d |j|  |d d/}t|| qd S )0Nr   rk   r   r   rm   g      @rn   rq   rp   rx   r   g      &@g      D@g      F@g      H@g      J@g      L@g      N@g      P@g      Q@rw   ro   rl   g      *@r   g      3@g      4@g      5@rj   g     1@r   g     J@r   g     B@g     `V@r   g     J@g     `_@r   g     @Q@g     0d@r   g     @U@g     h@r   r   )r!   r   r   )r2   r3   r   rr   r   r   r   r   )r*   re   r!   Zys_expectedr   r   r   r   r   r$   test_y_nd_x_1d   s:    


z'TestCumulative_trapezoid.test_y_nd_x_1dc                 C   s   t jdddd}t|}ddddg}t|| t|dd	}dddddg}t|| t|d
d}ddddg}t|| t|d
dd}dddddg}t|| d S )Nr   r   rP   r   r   r   rv   gGz?r   rk   r{   g      g      )r|   r   r   )r*   re   r   r   r   r   r$   test_x_none  s    


z$TestCumulative_trapezoid.test_x_nonec              	   C   sF   t dddd}|}tt||ddddt||dddddd	 d S )
Nr   rk   r   r   rj   r   )r|   r   r   g+=r(   )r2   r3   r   r   r   r   )r*   r!   re   r   r   r$   test_cumtrapz  s    z&TestCumulative_trapezoid.test_cumtrapzN)r5   r6   r7   r   r   r   r   r   r   r   r   r$   r      s
   
r   c                   @   s    e Zd ZdZdd Zdd ZdS )TestTrapezoidz[This function is tested in NumPy more extensive, just do some
    basic due diligence here.c                 C   sp   t d}tt|d tt|ddd tt|t ddddd	 t d}d
| }tt||ddd d S )Nr[   r\   rj   r{   r}   r   r   r    r~   r   g?)r!   r|   g      +@)r2   r3   r   r   r   r   r   r   r$   test_trapezoid!  s    

zTestTrapezoid.test_trapezoidc                 C   s8   t d}d| }tt||dddt||ddd d S )Nr   r   rj   r   )r!   r|   r   )r2   r3   r   r   r   r   r   r   r$   
test_trapz+  s
    
zTestTrapezoid.test_trapzN)r5   r6   r7   __doc__r   r   r   r   r   r$   r     s   
r   c                   @   s   e Zd Zdd ZddedfddZej	ddd	gej	d
ddgdd Z
ej	dddgddgddgddggdd Zej	dddgdd Zdd ZdS )TestQMCQuadc              	   C   s  d}t jt|d tdddgddg W 5 Q R X d}t jt|d tdd ddgddg W 5 Q R X d	d
 }d}t jt|d t|ddgddg W 5 Q R X d}t jt|d" tdd ddgddgdd W 5 Q R X d}t jt|d" tdd ddgddgdd W 5 Q R X d}t jt|d" tdd ddgddgdd W 5 Q R X d}t jt|d* tdd ddgddgtj	dd W 5 Q R X d}t jt|d" tdd ddgddgdd W 5 Q R X d S )Nz`func` must be callable.matchza duckr   r   z/`func` must evaluate the integrand at points...c                   S   s   dS Nr   r   r   r   r   r$   r%   ;  r&   z3TestQMCQuad.test_input_validation.<locals>.<lambda>c                 S   s   | j dkstt| S r   )ndimAssertionErrorr2   sumr    r   r   r$   func=  s    z/TestQMCQuad.test_input_validation.<locals>.funcz8Exception encountered when attempting vectorized call...z`n_points` must be an integer.c                 S   s   dS r   r   r    r   r   r$   r%   F  r&   g     @)n_pointsz!`n_estimates` must be an integer.c                 S   s   dS r   r   r    r   r   r$   r%   J  r&   r   )n_estimatesz8`qrng` must be an instance of scipy.stats.qmc.QMCEngine.c                 S   s   dS r   r   r    r   r   r$   r%   N  r&   )qrngz8`qrng` must be initialized with dimensionality equal to c                 S   s   dS r   r   r    r   r   r$   r%   R  r&   z,`log` must be boolean \(`True` or `False`\).c                 S   s   dS r   r   r    r   r   r$   r%   V  r&   r   log)
r   Zraises	TypeErrorqmc_quad
ValueErrorwarnsUserWarningr   qmcSobol)r*   messager   r   r   r$   test_input_validation4  s2    "&&&.z!TestQMCQuad.test_input_validation   r   r   c              
      sJ  d}t |t |  fddt jd}tjj||d}t |}t || }t	|||| f|d}	tj
j| |d}
t|d d	|	j }t|	j|
|d
 t ||	j dkstt jd}tjj||d}t	fdd|||| fd|d}tt |j|	j t |jt |dk r:t jndksFtd S )Nr   c                    s   t j|  S r/   )r   multivariate_normalpdfr    )covmeanr   r$   r   ^  s    z$TestQMCQuad.basic_test.<locals>.funcl   ^^@E9? )seed)r   r   r<   r   )Zlower_limitr   gףp=
?)ra   r   c                     s   t  |  S r/   )r2   r   rW   )r   r   r$   r%   n  r&   z(TestQMCQuad.basic_test.<locals>.<lambda>T)r   r   r<   r   r   )r2   zerosZeyerandomZdefault_rngr   r   r   onesr   r   cdfscZstdtritstandard_errorr   integralprodr   expimagr   )r*   r   r   signsr   rngr   r:   r;   resrefra   Zlogresr   )r   r   r   r$   
basic_testX  s8    



     zTestQMCQuad.basic_testr   i   r   r   c                 C   s   |  || d S r/   r   )r*   r   r   r   r   r$   
test_basict  s    zTestQMCQuad.test_basicr   r   r   c                 C   s   | j |d d S )N)r   r   )r*   r   r   r   r$   	test_signy  s    zTestQMCQuad.test_signr   FTc              	   C   sf   d}t jt|d" tdd ddgddg|d}W 5 Q R X |j|rJtj ndksTt|jdksbtd S )Nz-A lower limit was equal to an upper limit, sor   c                 S   s   dS r   r   r    r   r   r$   r%     r&   z'TestQMCQuad.test_zero.<locals>.<lambda>r   r   r   )	r   r   r   r   r   r2   infr   r   )r*   r   r   r   r   r   r$   	test_zero}  s
    &zTestQMCQuad.test_zeroc                 C   sF   dd }t |dd}tjjdddtjjddd }t|j|d d S )Nc                 S   s   t jj| ddS )Nr   Zscale)r   normr   r    r   r   r$   r     s    z-TestQMCQuad.test_flexible_input.<locals>.funcr   r   r   r   g{Gz?)r   r   r   r   r   r   )r*   r   r   r   r   r   r$   test_flexible_input  s     zTestQMCQuad.test_flexible_inputN)r5   r6   r7   r   r2   r   r   r   r   r   r   r   r   r   r   r   r   r$   r   3  s   $$

r   )&r   Znumpyr2   r   r   r   Znumpy.testingr   r   r   r	   r
   Zscipy.integrater   r   r   r   r   r   r   r   r   r   r   r   r   Zscipy.integrate._quadraturer   r   Zscipyr   r   r   r   r8   r   r   r   r   r   r   r$   <module>   s   < -T