a
    Re
E                     @   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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   Y/var/www/sunrise/env/lib/python3.9/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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 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 8}|	t
d td	d | | d
d}W d    n1 s0    Y  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*   ri   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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   )rS         @rS         @rP   g     @)rS         @rp   rS          @g     P@r   )      @      @@rm   rs   rr   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 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@)rx   gffffff?g @rp         "@N)r2   rt   r   dotr   )r*   r!   rf   ru   rv   Zexact_integralZnumeric_integralr   r   r$   test_newton_cotes2   s    
z!TestQuadrature.test_newton_cotes2zignore::DeprecationWarningc                 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||
 qt 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qt 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\   rk   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@rC   ry   )r~   r   r   gUUUUU\@         P@rl   )r!   r   axismulti_index)flags   )r   r   r   r      rP   }   )r!   r   rx   )rl   rl   rl   rl   )r   r   r   r   )rx   rx   rx   rx   竪Je@)r   r   r   r   )rx   g      a@g      @g      @)r   r   g*U@)r2   r3   r   r   linspacer   reshaperangeZnditerlistr   insertslicetuplert   power)r*   rf   r!   r   r:   iritr-   idxintegralr   Z	zero_axisZdefault_axisr   r   r$   test_simpson   s    


0D
0
zTestQuadrature.test_simpsonc                 C   sP   t ddd}|d }t  t||dd W d    n1 sB0    Y  d S )Nr   rl   r   r   r   r   )r2   r   pytestZdeprecated_callr   r*   r!   rf   r   r   r$   test_simpson_even_is_deprecated   s    
z.TestQuadrature.test_simpson_even_is_deprecated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   rP   )r   r   r   r   
      r   r   )r   )Zdtype)r2   rt   r   float64r   )r*   r   rf   resultr+   r   r   r$   test_simpson_2d_integer_no_x   s    
z+TestQuadrature.test_simpson_2d_integer_no_xc                 C   s4   t d}d| }tt||ddt||dd d S )NrP   r   rk   r!   r~   )r2   r3   r   r   r   r*   rf   r!   r   r   r$   
test_simps   s    
zTestQuadrature.test_simpsN)r5   r6   r7   r   rJ   rO   rT   rV   rY   rZ   r]   rh   rj   rw   r|   r   markfilterwarningsr   r   parametrizer   r   r   r   r   r$   r8      s$   


W
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   sX   t jdddd}|}t||dd}g d}t|| t||d d}t||dd   d S )	Nr   r   rP   numr   initial)rx                r   rx   r   r2   r   r   r   )r*   r!   rf   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   rl   r   r   r   r   )rx   rk   ry         @)rx   r         $@     0@)rx         !@      2@g     <@)rx         )@g      :@g     @D@)rx   r   g      A@g     @J@)rx        4@g      E@g      P@))r   r   r   )rl   r   r   )rl   r   rl   r   r   r   g@)r   r   )rl   r   r   )	r2   r3   r   r   rt   r   zipr   shape)r*   r!   rf   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|| qd S )Nr   rl   r   r   )rn         @ro   rr   )rq   rz   r         &@)g      D@g      F@g      H@g      J@)g      L@g      N@r   g      Q@)ry   rp   rn   r   )r   r   rm   g      *@)r   g      3@g      4@r   )rk   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   )r2   r3   r   rt   r   r   r   r   )r*   rf   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|}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   rP   r   )r   r   r   rx   Gz?r   )r   r   r   r   rx   rl   r}   )            r   rx   )r~   r   )r   r   r   r   rx   r   )r*   rf   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   rl   r   r   rk   r   )r~   r   r   +=r(   )r2   r3   r   r   r   r   r   r   r   r$   test_cumtrapzQ  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\   rk   r}   r   r   r   r    r   r   g?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   rk   r   )r!   r~   r   )r2   r3   r   r   r   r   r   r   r$   
test_trapzg  s
    
zTestTrapezoid.test_trapzN)r5   r6   r7   __doc__r   r   r   r   r   r$   r   Z  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 s0    Y  d	d
 }d}t jt|d$ t|ddgddg W d    n1 s0    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 s0    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.matchza duckr   r   z/`func` must evaluate the integrand at points...c                   S   s   dS Nr   r   r   r   r   r$   r%   w  r&   z3TestQMCQuad.test_input_validation.<locals>.<lambda>c                 S   s   | j dksJ t| S r   )ndimr2   sumr    r   r   r$   funcy  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   Zraises	TypeErrorr   
ValueErrorwarnsUserWarningr   qmcSobol)r*   messager   r   r   r$   test_input_validationp  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sJ 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 r/   )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=
?)rb   r   c                     s   t  |  S r/   )r2   r   rW   )r   r   r$   r%     r&   z(TestQMCQuad.basic_test.<locals>.<lambda>T)r   r   r   r   r   r(   gؗҜ<ra   )r2   zerosZeyerandomZdefault_rngr   r   r   onesr   r   cdfscZstdtritstandard_errorr   r   prodexpimagr   )r*   r   r   signsr   rngr   r:   r;   resrefrb   Zlogresr   )r   r   r   r$   
basic_test  s4    



,zTestQMCQuad.basic_testr   i   r   r   c                 C   s   |  || d S r/   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   r2   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   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   o  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   r   Zscipyr   r   r   r   r8   r   r   r   r   r   r   r$   <module>   s   @ iT