U
    »mœdÕ;  ã                   @   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   ú^/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/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 )NçÇY)	kŸRr   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 =‘`äXáCr   r=   r   r   r$   r?   L   s    z0TestQuadrature.test_romberg_rtol.<locals>.myfuncr   r@   rL   rU   g´Ãæ�3>Å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:Œ0âŽyE>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|ƒ q–d 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||ƒ qÔd 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   g®Gáz®ó?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sÆt‚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   ZzerosÚ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   ©Úscale)r   ÚnormrÍ   r    r   r   r$   r¼   ˆ  s    z-TestQMCQuad.test_flexible_input.<locals>.funcr   r   r   rå   g{®Gáz„?)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”   Ú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