a
    ‡ù»j-x  ã                   @   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 d dlmZ d dlm  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!m"Z"m#Z# d dl$m%Z% d dl&m'Z'm(Z( G dd	„ d	ƒZ)e j* +d
¡G dd„ dƒƒZ,e j* -deeg¡dd„ ƒZ.G dd„ dƒZ/G dd„ dƒZ0G dd„ dƒZ1dddddœdd„Z2G dd„ dƒZ3dS )é    N©ÚcosÚsinÚpi)Úassert_equalÚassert_almost_equalÚassert_allcloseÚassert_Úsuppress_warnings)Úgiven)Ú
quadratureÚrombergÚrombÚnewton_cotesÚcumulative_trapezoidÚcumtrapzÚtrapzÚ	trapezoidÚquadÚsimpsonÚsimpsÚ
fixed_quadÚAccuracyWarningÚqmc_quadÚcumulative_simpson)Ú%_cumulative_simpson_unequal_intervals)Ú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"   úKE:\soccer\ml_env\Lib\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/   r0   r"   r3   r'   Útest_vector   s
    zTestFixedQuad.test_vectorN)Ú__name__Ú
__module__Ú__qualname__r1   r7   r"   r"   r"   r'   r      s   r   úignore::DeprecationWarningc                   @   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ej d¡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 r2   )Ú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 r2   r   ©r$   r&   Úzr"   r"   r'   Úmyfunc*   s    z.TestQuadrature.test_quadrature.<locals>.myfuncr   ©r!   çÍÌÌÌÌÌü?çì®Û—Ó?é   ©Údecimal)r   r   r   ©r-   rC   Ú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   rA   r"   r"   r'   rC   1   s    z3TestQuadrature.test_quadrature_rtol.<locals>.myfuncr   rD   ç»½×Ùß|Û=r+   ç…Ø.©<ƒR©r   r   r   rJ   r"   r"   r'   Útest_quadrature_rtol0   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 r2   r   rA   r"   r"   r'   rC   9   s    z6TestQuadrature.test_quadrature_miniter.<locals>.myfuncrF   )é   é4   r   rD   )ÚminiterrG   rH   ç      ð?)r   r   r   r	   )r-   rC   rM   rV   rK   rL   r"   r"   r'   Útest_quadrature_miniter7   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 )NrO   rE   r   )r$   r&   r"   r"   r'   rC   B   s    z:TestQuadrature.test_quadrature_single_args.<locals>.myfuncr   r!   rP   ©r@   r,   rQ   r+   rR   rJ   r"   r"   r'   Útest_quadrature_single_argsA   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 r2   r   rA   r"   r"   r'   rC   J   s    z+TestQuadrature.test_romberg.<locals>.myfuncr   rD   ©r@   rF   rG   rH   )r   r   r   ©r-   rC   rK   rM   r"   r"   r'   Útest_rombergH   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   rA   r"   r"   r'   rC   R   s    z0TestQuadrature.test_romberg_rtol.<locals>.myfuncr   rD   rP   rY   g´Ãæ�3>ÅCr+   )r   r   r   r\   r"   r"   r'   Útest_romberg_rtolP   s    z TestQuadrature.test_romberg_rtolc                 C   s   t tt d¡ƒdƒ d S )Né   é€   )r   r   r5   r6   ©r-   r"   r"   r'   Ú	test_rombX   s    zTestQuadrature.test_rombc                 C   s®   t  d¡}t  d| ¡}t|ƒ}tdd„ | ¡ | ¡ ƒ\}}t||ddd� tƒ �8}| 	t
d¡ td	d„ | ¡ | ¡ d
d�}W d   ƒ n1 s�0    Y  t||ddd� d S )Nr_   çš™™™™™É?c                 S   s   t  d|  ¡S ©Nrc   ©r5   r   r#   r"   r"   r'   r(   `   r)   z2TestQuadrature.test_romb_gh_3731.<locals>.<lambda>g:Œ0âŽyE>r   ©r,   Úatolzdivmax .4. exceededc                 S   s   t  d|  ¡S rd   re   r#   r"   r"   r'   r(   f   r)   r   )Zdivmaxr*   )r5   r6   r   r   r   ÚminÚmaxr   r
   Úfilterr   r   )r-   r$   ÚyrK   Zval2rL   ÚsupZval3r"   r"   r'   Útest_romb_gh_3731[   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Ý?rG   rH   )Úmathr   r   r   )r-   rn   ZvalmathZexpected_valr"   r"   r'   Útest_non_dtypei   s    zTestQuadrature.test_non_dtypec                 C   s  d}t |dƒ\}}t||t ddg¡ ƒ t||d  d ƒ d}t |dƒ\}}t||t g d¢¡ d ƒ t||d  d	 ƒ d}t |dƒ\}}t||t g d
¢¡ d ƒ t||d  d ƒ d}t |dƒ\}}t||t g d¢¡ d ƒ t||d  d ƒ dS )z5Test the first few degrees, for evenly spaced points.r    ç      à?é   ç      (@r!   )rW   ç      @rW   ç      @rT   g     €¦@)rW   ç      @ru   rW   ç       @g     P¹@r   )ç      @ç      @@rr   rx   rw   g     €V@rG   g     ˆ=AN)r   r   r5   Úarrayr   )r-   r&   ÚwtsÚerrcoffr"   r"   r'   Útest_newton_cotesp   s     z TestQuadrature.test_newton_cotesc                 C   s|   t  g d¢¡}|d }t|ƒ\}}d}t  ||¡}t||ƒ t  g d¢¡}|d }t|ƒ\}}d}t  ||¡}t||ƒ dS )z9Test newton_cotes with points that are not evenly spaced.)ç        g      ø?ç       @r!   gUUUUUU@)r}   gffffffö?gÍÌÌÌÌÌ @ru   ç      "@N)r5   ry   r   Údotr   )r-   r$   rk   rz   r{   Zexact_integralZnumeric_integralr"   r"   r'   Útest_newton_cotes2†   s    
z!TestQuadrature.test_newton_cotes2r;   c                 C   sj  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dd¡}dd„ }tt||ƒ|dd�dƒ tt||ƒ|dd�dƒ t  ddd¡}tt||ƒddd�dƒ tt||ƒddd�dƒ t  d¡ dd¡}t  d¡ ddd¡}||ƒ}tdƒD ]Œ}t||d|d �}t j|d!gd"�}|D ]`}t	|j
ƒ}	|	 |td ƒ¡ |t|	ƒ d# d d |t|	ƒ d d d  }
t||j
 |
ƒ �qv�qNt  d¡ d$d
¡}||ƒ}d%D ]d}t|||d#d �}d|d d …df |d d …df   |d d …df |d d …df   }
t||
ƒ �qút  d&¡ d'd'¡}t  d(¡ d'd'd'¡}||ƒ}tdƒD ]Š}t|||d)�}t j|d!gd"�}|D ]`}t	|j
ƒ}	|	 |td ƒ¡ |t|	ƒ d# d d |t|	ƒ d d d  }
t||j
 |
ƒ �q¼�q–t  dg¡}t  |d
¡}tt||dd)�d*ƒ tt||d#d)�d*ƒ t  g d+¢¡}t  |d
¡}tt||dd)�d*ƒ tt||d#d)�d*ƒ t  g d,¢g d,¢g d,¢g¡}t  |d
¡}g d-¢}d.gd }tt||dd)�|ƒ tt||d#d)�|ƒ t  g d,¢g d,¢g d/¢g¡}t  |d
¡}g d0¢}g d1¢}tt||dd)�|ƒ tt||d#d)�|ƒ d S )2Nr_   r`   rp   ©Údxé@   r   r   r#   é    r!   Úavg©r$   Úeveng     À+@Úfirstg     €+@Úlasté   r    c                 S   s   | d S )Nr!   r"   r#   r"   r"   r'   Úf¨   s    z&TestQuadrature.test_simpson.<locals>.fr   ç      5@g«ªªªª*5@rG   r~   )rƒ   rˆ   ér   gUUUUUÕ\@é   ç      P@rq   )r$   rˆ   ÚaxisÚmulti_index)Úflagséÿÿÿÿé   )r   r†   r‰   rŠ   é   rT   é}   ©r$   r‘   r}   )rq   rq   rq   rq   )r    r!   r   r•   )r}   r}   r}   r}   ç«ªªªªJe@)r    r•   r�   r…   )r}   g      a@g      ‘@g      Á@)r™   r™   gªªªª*UÅ@)r5   r6   r   r   Úlinspacer   ÚreshapeÚrangeZnditerÚlistr’   ÚinsertÚsliceÚtuplery   Úpower)r-   rk   r$   rŒ   r>   ÚiÚrÚitr0   ÚidxÚintegralrˆ   Z	zero_axisZdefault_axisr"   r"   r'   Útest_simpson˜   s€    


0D
0
zTestQuadrature.test_simpsonc                 C   sŠ   t  ddd¡}|d }tjdd�� t||dd� W d   ƒ n1 sF0    Y  tjd	d�� t||ƒ W d   ƒ n1 s|0    Y  d S )
Nr   rq   r   r!   z The 'even' keyword is deprecated©Úmatchr‰   r‡   zuse keyword arguments)r5   rš   ÚpytestÚdeprecated_callr   ©r-   r$   rk   r"   r"   r'   Útest_simpson_deprecationsð   s    ,z(TestQuadrature.test_simpson_deprecationsÚdroplastFTc                 C   s`   t  g d¢g d¢g¡}|r.|d d …d d…f }t|dd�}tt j|t jd�dd�}t||ƒ d S )N)r!   r!   r   r   r•   r•   éüÿÿÿrT   )r   r   r!   r¯   é
   é   éþÿÿÿr°   r”   ©r‘   )Zdtype)r5   ry   r   Úfloat64r   )r-   r®   rk   Úresultr.   r"   r"   r'   Útest_simpson_2d_integer_no_xø   s    
ÿz+TestQuadrature.test_simpson_2d_integer_no_xc                 C   s`   t  d¡}d| }tjdd��. tt||dd�t||dd�ƒ W d   ƒ n1 sR0    Y  d S )NrT   r!   r   r¨   rp   ©r$   rƒ   )r5   r6   rª   r«   r   r   r   ©r-   rk   r$   r"   r"   r'   Ú
test_simps  s    
þzTestQuadrature.test_simpsN)r8   r9   r:   r   rN   rS   rX   rZ   r]   r^   rb   rm   ro   r|   r�   rª   ÚmarkÚfilterwarningsr§   r­   Úparametrizer¶   r¹   r"   r"   r"   r'   r<   #   s$   


W
r<   Úfuncc                 C   sL   d| j › d�}tj|d�� | tjddƒ W d   ƒ n1 s>0    Y  d S )Nz`scipy.integrate.z` is deprecated...r¨   r   r    )r8   rª   r«   r5   Úexp)r½   Úmessager"   r"   r'   Útest_deprecate_integrator  s    rÀ   c                   @   sV   e Z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d„ ZdS )ÚTestCumulative_trapezoidc                 C   sX   t jdddd�}|}t||dd�}g d¢}t||ƒ t||d d�}t||dd … ƒ d S )	Nr²   r!   rT   ©Únumr   ©Úinitial)r}   ç      ø¿ç       ÀrÆ   r}   r    ©r5   rš   r   r   )r-   r$   rk   Ú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  g d¢g d¢gg d	¢g d
¢gg d¢g d¢gg¡}t||ƒ g d¢}tg d¢|ƒD ]@\}}t||d|d�}t|jdƒ t||d |d�}t|j|ƒ qzd S )Né   rq   r!   r   r   rÄ   )r}   rp   r~   ç      @)r}   rÍ   ç      $@ç     €0@)r}   ç      !@ç      2@g     €<@)r}   ç      )@g      :@g     @D@)r}   rÏ   g      A@g     @J@)r}   ç     €4@g      E@g      P@))r!   r!   r   )rq   r    r   )rq   r!   rq   ©r   r    r!   )rÅ   r‘   )rq   r!   r   )	r5   r6   r›   r   ry   r   Úzipr   Úshape)r-   r$   rk   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  g d¢g d¢gg d¢g d¢gg¡t  g d	¢gg d
¢gg d¢gg¡t  g d¢g d¢gg d¢g d¢gg d¢g d¢gg¡f}tg d¢|ƒD ]0\}}t||d |j| … |d d�}t||ƒ qªd S )NrÌ   rq   r!   r   )rs   ç      @rt   rw   )rv   r   rÎ   ç      &@)g      D@g      F@g      H@g      J@)g      L@g      N@r�   g      Q@)r~   ru   rs   rØ   )rÎ   rÙ   rr   ç      *@)rÑ   g      3@g      4@r�   )rp   rØ   g     €1@)rÍ   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Å   )r5   r6   r›   ry   rÕ   r   rÖ   r   )r-   rk   r$   Zys_expectedr‘   rÊ   rÉ   r"   r"   r'   Útest_y_nd_x_1d6  s:    
ÿÿþþ
ÿÿÿüøÿz'TestCumulative_trapezoid.test_y_nd_x_1dc                 C   sŠ   t jdddd�}t|ƒ}g d¢}t||ƒ t|dd�}g d¢}t||ƒ t|d	d
�}g d¢}t||ƒ t|d	dd�}g d¢}t||ƒ d S )Nr²   r!   rT   rÂ   )rÆ   rÇ   rÆ   r}   r   rÄ   )r   rÆ   rÇ   rÆ   r}   rq   r‚   )ç      Àç      ÀrÜ   r}   )rƒ   rÅ   )r   rÜ   rÝ   rÜ   r}   rÈ   )r-   rk   rÉ   rÊ   r"   r"   r'   Útest_x_noneN  s    


z$TestCumulative_trapezoid.test_x_nonerÅ   r    rp   c              	   C   sz   t jdddd�}tjdd�� t||d�}W d  ƒ n1 s>0    Y  t||gt  |dd… |dd	…  ¡d
 ¢ƒ dS )z4If initial is not None or 0, a ValueError is raised.r   r°   rÂ   z	`initial`r¨   rÄ   Nr    r”   r!   )r5   rš   rª   r«   r   r   Zcumsum)r-   rÅ   rk   Úresr"   r"   r'   Útest_initial_warninga  s    *z-TestCumulative_trapezoid.test_initial_warningc                 C   s<   t jtdd�� tg d� W d   ƒ n1 s.0    Y  d S )NúAt least one point is requiredr¨   ©rk   )rª   ÚraisesÚ
ValueErrorr   ra   r"   r"   r'   Útest_zero_len_yk  s    z(TestCumulative_trapezoid.test_zero_len_yc              
   C   sr   t  d¡ ddd¡}|}tjdd��: tt||dddd	�t||dddd	�d
d� W d   ƒ n1 sd0    Y  d S )NrÌ   rq   r!   r   r   r¨   rp   r   )rƒ   r‘   rÅ   ç›+¡†›„=r+   )r5   r6   r›   rª   r«   r   r   r   r¬   r"   r"   r'   Útest_cumtrapzo  s    þz&TestCumulative_trapezoid.test_cumtrapzN)r8   r9   r:   rË   r×   rÛ   rÞ   rª   rº   r¼   rà   rå   rç   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	S )
ÚTestTrapezoidc                 C   sF   t  ddd¡}tt  d|d  ¡t  dt j ¡ dd�}t|dƒ d S )Néöÿÿÿr°   gš™™™™™¹?g      à¿r!   r‚   r    )r5   r6   r   r¾   Úsqrtr   r   )r-   r$   r£   r"   r"   r'   Útest_simplez  s    *zTestTrapezoid.test_simplec                 C   s&  t  ddd¡}t  ddd¡}t  ddd¡}t  |¡|d |d   }|d  d  < |d  d  < t  |¡|d |d   }|d  d  < |d  d  < t  |¡|d |d   }|d  d  < |d  d  < |d d …d d f |d d d …d f  |d d d d …f  }||d d …d d f  jdd�}||d d d …d f  jdd�}	||d d d d …f  jdd�}
t||d d …d d f dd	�}t||ƒ t||d d d …d f dd	�}t||	ƒ t||d d d d …f dd	�}t||
ƒ t||dd	�}t||ƒ t||dd	�}t||	ƒ t||dd	�}t||
ƒ d S )
Nr   r    rq   r!   r•   é   r”   r³   r˜   )r5   rš   Z	ones_likeÚsumr   r   )r-   r$   rk   rB   ZwxZwyZwzÚqZqxZqyZqzr£   r"   r"   r'   Ú	test_ndim€  s8    6




zTestTrapezoid.test_ndimc                 C   s‚   t  d¡}|| }|dk}t jj||d�}d}tt||ƒ|ƒ t jj||d�}tt||ƒ|ƒ t jj||d�}tt||ƒ|ƒ d S )NrT   r!   )ÚmaskrÚ   )r5   r6   Úmary   r   r   )r-   r$   rk   rð   Zymr£   Zxmr"   r"   r'   Útest_masked¥  s    
zTestTrapezoid.test_maskedc              	   C   sd   t  d¡}d| }tjdd��2 tt||ddd�t||ddd�ƒ W d   ƒ n1 sV0    Y  d S )Nr   r!   r   r¨   rp   r   )r$   rƒ   r‘   )r5   r6   rª   r«   r   r   r   r¸   r"   r"   r'   Útest_trapz_aliasµ  s    
ÿzTestTrapezoid.test_trapz_aliasN)r8   r9   r:   rë   rï   rò   ró   r"   r"   r"   r'   rè   y  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   sz  d}t jt|d��$ tdddgddgƒ W d   ƒ n1 s<0    Y  d}t jt|d��( tdd„ ddgddgƒ W d   ƒ n1 s†0    Y  d	d
„ }d}t jt|d��$ t|ddgddgƒ W d   ƒ n1 sÔ0    Y  d}t jt|d��, tdd„ ddgddgdd� W d   ƒ n1 �s$0    Y  d}t jt|d��, tdd„ ddgddgdd� W d   ƒ n1 �st0    Y  d}t jt|d��, tdd„ ddgddgdd� W d   ƒ n1 �sÄ0    Y  d}t jt|d��4 tdd„ ddgddgtj 	d¡d� W d   ƒ n1 �s0    Y  d}t jt|d��, tdd„ ddgddgdd� W d   ƒ n1 �sl0    Y  d S )Nz`func` must be callable.r¨   z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J ‚t | ¡S rõ   )Úndimr5   rí   r#   r"   r"   r'   r½   È  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(   Ñ  r)   g     �@)Ún_pointsz!`n_estimates` must be an integer.c                 S   s   dS rõ   r"   r#   r"   r"   r'   r(   Õ  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(   Ù  r)   )Úqrngz8`qrng` must be initialized with dimensionality equal to c                 S   s   dS 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(   á  r)   r°   ©Úlog)
rª   rã   Ú	TypeErrorr   rä   ÚwarnsÚUserWarningr   ÚqmcÚSobol)r-   r¿   r½   r"   r"   r'   Útest_input_validation¿  s2    262<<<Dz!TestQMCQuad.test_input_validationé   r•   r!   c              	      s\  d}t  |¡‰t  |¡‰ ‡ ‡fdd„‰t j d¡}tjj||d�}t  |¡}t  |¡| }t	ˆ|||||d�}	tj
j|ˆˆ |d�}
t |d d	¡|	j }t|	j|
|d
� t  |¡|	j dksÀJ ‚t j d¡}tjj||d�}t	‡fdd„||||d|d�}tt  |j¡|	jdd� t  |j¡t  |¡dk �r2t jndk�s>J ‚tt  |j¡|	jddd� d S )Nr!   c                    s   t j | jˆˆ ¡S r2   )r   Úmultivariate_normalÚpdfÚTr#   )ÚcovÚmeanr"   r'   r½   é  s    z$TestQMCQuad.basic_test.<locals>.funcl   é^^@E9®? )Úseed)r÷   rø   rù   )Zlower_limitr    g×£p=
×ï?)rg   r   c                     s   t  ˆ | Ž ¡S r2   )r5   rû   r[   )r½   r"   r'   r(   ù  r)   z(TestQMCQuad.basic_test.<locals>.<lambda>T)r÷   rø   rû   rù   ræ   r+   g¼‰Ø—²Òœ<rf   )r5   ÚzerosÚeyeÚrandomÚdefault_rngr   rÿ   r   Úonesr   r  Úcdfr   ZstdtritÚstandard_errorr   r¦   Úprodr¾   Úimagr   )r-   r÷   rø   Úsignsrö   Úrngrù   r>   r?   rß   Úrefrg   Zlogresr"   )r  r½   r  r'   Ú
basic_testã  s4    



ÿþ,ÿzTestQMCQuad.basic_testr÷   i   rø   r�   c                 C   s   |   ||¡ d S r2   ©r  )r-   r÷   rø   r"   r"   r'   Ú
test_basic  s    zTestQMCQuad.test_basicr  r    r”   c                 C   s   | j |d� d S )N)r  r  )r-   r  r"   r"   r'   Ú	test_sign  s    zTestQMCQuad.test_signrû   FTc                 C   sz   d}t jt|d��, tdd„ ddgddg|d�}W d   ƒ n1 sD0    Y  |j|r^tj ndkshJ ‚|jdksvJ ‚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¦   r5   Úinfr  )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)r8   r9   r:   r  r5   r  r  rª   rº   r¼   r  r  r  r  r"   r"   r"   r'   rô   ¾  s   $$

rô   r”   ©r$   rƒ   rÅ   r‘   c          	         sf  | j | dk r>|d u r(t| |||d d�S |t| |||dd� S t | |d¡} t |¡dkrht ||d¡n|}t |¡dkrˆt ||d¡n|}t |¡dkr¨t ||d¡n|}| j d ‰ |d urÌ|t ˆ ¡ n|}|d u }|ràdn|}t || j ¡}t || j d d… d ¡}tj| ||fdd�}‡ fdd	„}t |d|¡}|�rP|d
dd …f n|}t |d|¡}|S )Nrq   )r$   rƒ   r‘   rÅ   r   r”   r    )r    r³   c                    s.   t | d ˆ … | ˆ dˆ  … | dˆ  d … d�S )Nr!   )r$   rÅ   )r   )rB   r%   r"   r'   rŒ   8  s    z*cumulative_simpson_nd_reference.<locals>.f.)	rÖ   r   r5   Zmoveaxisrö   r6   Zbroadcast_toÚconcatenateZapply_along_axis)	rk   r$   rƒ   rÅ   r‘   Zinitial_was_nonerB   rŒ   rß   r"   r%   r'   Úcumulative_simpson_nd_reference  s(       
r!  c                   @   sÚ  e Zd Ze d¡Zed Zej 	dd¡ej 	dd¡dd„ ƒƒZ
ej 	de d	d
¡¡ej 	dd¡ej 	dd¡ej 	dd¡ej 	dd¡dd„ ƒƒƒƒƒZej 	ddeg d¢d�fdeeg d¢geegd�fdeeeegeeegdd�fdeg g d�fdedd�fd ee d!¡d�fd"ee d!¡d#�fd$ed%e d!¡d&�fg¡d'd(„ ƒZd)d*„ Zd+d,„ Zeejejejdd
d-d.�ejd/d-d0d1� d2d3„ ¡d4�d5�d6d7„ ƒZeejejejdd
d-d.�ejd/d-d0d1� d8d3„ ¡d4�d5�d9d:„ ƒZd%S );ÚTestCumulativeSimpsonr   r!   Úuse_dx)FTÚuse_initialc                 C   sr  t j d¡}d}|rdnd}| ¡ }|dkr<t  | |¡¡nt  |¡| | ¡  }t  |d ¡d d …t jf }| |d ¡d d …t jf }	t j|	||  dd�}
t j|	||d   |d  dd�}|rÊ|n||d  dd … }|rê|d nd }|rúd|ind	|i}t|
fi |¤d
|i¤Ž}|�s0t||dd� n>|�r:dnd}t||dd� t||d d… ||d d… dd� d S )Nì   F»*ŒBG r°   rq   r!   r    r   r³   rƒ   r$   rÅ   gVçž¯â<r+   g{®Gázd?)	r5   r  r  Úsortr6   Znewaxisrí   r   r   )r-   r#  r$  r  r&   Úorderrƒ   r$   r¢   Úcrk   ÚYr  rÅ   Úkwargrß   Zi0r"   r"   r'   rË   F  s(    ÿ"zTestCumulativeSimpson.test_1dr‘   éýÿÿÿrq   Úx_ndim)r    rq   Úx_len)r    r!   rG   Úi_ndim)Nr   rq   rƒ   )NTc                 C   s  t j d¡}dd|g}|d ||  ||< |d< | ¡ }d||< |dkrL|nd}	|j|d�}
d	\}}|r†|dkr||j|d�n| ¡ }n4|dkr¤t j|j|d�|d
�nt  |j|| d�¡}|d u rÆd n
|j|	d�}t|
||||d�}t|
||||d�}t jj||dd� d S )Nr%  rT   é   r”   r    rq   r"   ©Úsize)NNr³   r  gVçž¯Ò<r+   )	r5   r  r  Úcopyr&  r   r!  Útestingr   )r-   r‘   r,  r-  r.  rƒ   r  rÖ   Zshape_len_1Zi_shaperk   r$   rÅ   rß   r  r"   r"   r'   Útest_ndi  s"    
ÿzTestCumulativeSimpson.test_nd)r¿   Úkwarg_updatezx must be strictly increasing)r!   r!   rq   r   r#   )r!   r!   r   r•   ©r$   rk   r   )r$   rk   r‘   rá   z-`axis=4` is not valid for `y` with `y.ndim=1`r³   z+shape of `x` must be the same as `y` or 1-DrT   z'`initial` must either be a scalar or...rÄ   z"`dx` must either be a scalar or...Nr·   c                 C   sb   t | j| jd d dd�}tjt|d��* tf i t |fi |¤Ž¤Ž W d   ƒ n1 sT0    Y  d S )Nr”   )rk   r$   rƒ   rÅ   r‘   r¨   )ÚdictÚy0Úx0rª   rã   rä   r   )r-   r¿   r5  Zkwargs0r"   r"   r'   Útest_simpson_exceptionsˆ  s    z-TestCumulativeSimpson.test_simpson_exceptionsc                 C   s2   t j d¡}|jdd�}t|dd�}t|dƒ d S )Nr%  r°   r0  r   r‚   )r5   r  r  r   r   )r-   r  rk   rß   r"   r"   r'   Útest_special_cases—  s    z(TestCumulativeSimpson.test_special_casesc                 C   s¶   t j|dd�}t||ƒ}t|dddd…f |dddd…f ƒdddd…f }g |jdd… ¢d‘R }t jt  |¡|ddd…f |ddd…f  t  |¡gdd�}d|dddd…f< |S )aj  `cumulative_simpson` and `simpson` can be tested against other to verify
        they give consistent results. `simpson` will iteratively be called with
        successively higher upper limits of integration. This function calculates
        the theoretical correction required to `simpson` at even intervals to match
        with `cumulative_simpson`.
        r”   r³   .Nr    r}   r!   )r5   Údiffr   rÖ   r   r	  )r-   rk   r$   ÚdZsub_integrals_h1Zsub_integrals_h2Zzeros_shapeÚtheoretical_differencer"   r"   r'   Ú1_get_theoretical_diff_between_simps_and_cum_simps¢  s"    
 ÿþýú
zGTestCumulativeSimpson._get_theoretical_diff_between_simps_and_cum_simpsr°   )Zmax_dimsZmin_sideZmax_sideré   F)Ú	allow_nanc                 C   s   t | ƒdkS ©NgH¯¼šò×z>©Úabsr#   r"   r"   r'   r(   Ä  r)   zTestCumulativeSimpson.<lambda>)Úelementsrâ   c                 C   sp   dd„ }t |dd�}||ƒ}| j|t |jd ¡d�}tj |ddd	…f |ddd	…f |ddd	…f  ¡ d	S )
áe  Theoretically, the output of `cumulative_simpson` will be identical
        to `simpson` at all even indices and in the last index. The first index
        will not match as `simpson` uses the trapezoidal rule when there are only two
        data points. Odd indices after the first index are shown to match with
        a mathematically-derived correction.c                    s,   t j‡ fdd„tdˆ jd d ƒD ƒdd�S )Nc                    s$   g | ]}t ˆ d d|…f dd�‘qS ).NrW   r‚   ©r   ©Ú.0r¢   râ   r"   r'   Ú
<listcomp>Ñ  r)   z|TestCumulativeSimpson.test_cumulative_simpson_against_simpson_with_default_dx.<locals>.simpson_reference.<locals>.<listcomp>r!   r”   r    r³   ©r5   Ústackrœ   rÖ   râ   r"   râ   r'   Úsimpson_referenceÏ  s    "ÿzhTestCumulativeSimpson.test_cumulative_simpson_against_simpson_with_default_dx.<locals>.simpson_referencerW   r‚   r”   r#   .r    N)r   r?  r5   r6   rÖ   r3  r   )r-   rk   rL  rß   r  r>  r"   r"   r'   Ú7test_cumulative_simpson_against_simpson_with_default_dxÀ  s    ÿ,ÿzMTestCumulativeSimpson.test_cumulative_simpson_against_simpson_with_default_dxc                 C   s   t | ƒdkS rA  rB  r#   r"   r"   r'   r(   â  r)   c                 C   sÀ   d|j d d  }tjdd|j d d�}|dd… d| tj ddt|ƒd ¡  |dd…< dd	„ }t||d
�}|||ƒ}|  ||¡}tj 	|ddd…f |ddd…f |ddd…f  ¡ dS )rE  r°   r”   r    r   rÂ   Nrc   c                    s.   t j‡ ‡fdd„tdˆjd d ƒD ƒdd�S )Nc                    s0   g | ](}t ˆd d|…f ˆ d d|…f d�‘qS ).Nr#   rF  rG  r6  r"   r'   rI  ó  r)   zlTestCumulativeSimpson.test_cumulative_simpson_against_simpson.<locals>.simpson_reference.<locals>.<listcomp>r!   r”   r    r³   rJ  )rk   r$   r"   r6  r'   rL  ñ  s    "þzXTestCumulativeSimpson.test_cumulative_simpson_against_simpson.<locals>.simpson_referencer#   .)
rÖ   r5   rš   r  ÚuniformÚlenr   r?  r3  r   )r-   rk   Úintervalr$   rL  rß   r  r>  r"   r"   r'   Ú'test_cumulative_simpson_against_simpsonÞ  s    4
ÿ,ÿz=TestCumulativeSimpson.test_cumulative_simpson_against_simpson)r8   r9   r:   r5   r6   r9  r8  rª   rº   r¼   rË   r4  r7  r:  r;  r?  r   Úhyp_numZarraysr´   Zarray_shapesÚstZfloatsrj   rM  rQ  r"   r"   r"   r'   r"  B  sP   
!ø

ýÿ
ýÿr"  )4rª   Únumpyr5   r   r   r   Znumpy.testingr   r   r   r	   r
   Z
hypothesisr   Zhypothesis.strategiesZ
strategiesrS  Zhypothesis.extra.numpyÚextrarR  Zscipy.integrater   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zscipy.integrate._quadraturer   Zscipyr   r   r   rº   r»   r<   r¼   rÀ   rÁ   rè   rô   r!  r"  r"   r"   r"   r'   Ú<module>   s(   D
 l
cE_%