o
    Ö­jš�  ã                   @   s&  d dl Z d dlZd dlZd dl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ZmZmZmZmZmZ d dlmZ ej d¡gZejj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„ Z0d4d5„ Z1d6d7„ Z2d8d9„ Z3d:d;„ Z4eG d<d=„ d=ƒƒZ5ej 6d>d?g¡ej 6d@dAg¡ej 6dBg dC¢¡eG dDdE„ dEƒƒƒƒƒZ7eG dFdG„ dGƒƒZ8eG dHdI„ dIƒƒZ9eG dJdK„ dKƒƒZ:eedLdMgdN�G dOdP„ dPƒƒƒZ;G dQdR„ dReƒZ<dS )Sé    N)Úarray_namespaceÚxp_assert_closeÚxp_sizeÚ	np_compatÚis_array_api_strict)Úarray_api_compatible)Úcubature)ÚRuleÚ	FixedRuleÚNestedFixedRuleÚGaussLegendreQuadratureÚGaussKronrodQuadratureÚGenzMalikCubature)Ú_InfiniteLimitsTransformÚskip_xp_backendsc                 C   s    |  | d¡}|  |d¡}|| S ©N)éÿÿÿÿé   r   )r   r   r   ©Úreshape)ÚxÚnÚxpÚ
x_reshapedÚ
n_reshaped© r   ú`/var/www/html/CropPilot/venv/lib/python3.10/site-packages/scipy/integrate/tests/test_cubature.pyÚbasic_1d_integrand%   ó   r   c                 C   s   |  d| d  | d  d¡S )Né   r   ©r   r   r   ©r   r   r   r   r   Úbasic_1d_integrand_exact,   s   r"   c                 C   s"   |  |j| dd�d¡|  |d¡ S )Nr   ©Úaxisr    ©r   r   )r   Úsum)r   r   r   r   r   r   Úbasic_nd_integrand1   s   "r'   c                 C   s*   dd|    dd|    d|  d|    S )Nr   é   é   r   r   r!   r   r   r   Úbasic_nd_integrand_exact5   s   *r*   c                 C   sl   | j d | j d }}|d }| | |gdgt|j ƒd  ¢|‘R ¡}| dtj | |j|| dd� ¡S )zÍ
    .. math:: f_1(\mathbf x) = \cos\left(2\pi r + \sum^n_{i = 1}\alpha_i x_i\right)

    .. code-block:: mathematica

        genzMalik1980f1[x_List, r_, alphas_List] := Cos[2*Pi*r + Total[x*alphas]]
    r   r   ©N.r   r   r#   )Úshaper   ÚlenÚcosÚmathÚpir&   )r   ÚrÚalphasr   ÚnpointsÚndimÚalphas_reshapedr   r   r   r   Úgenz_malik_1980_f_1:   s   	(&r6   c                 C   s¼   t | ƒ}| | g dgt|jƒd  ¢|‘R ¡} | |g dgt|jƒd  ¢|‘R ¡}d| d |j|dd� | dtj | |j|| |  d dd� ¡ |j| 	|| |  d ¡dd� S )Nr   éþÿÿÿr   r#   r   ç      à?)
r   r   r-   r,   Úprodr.   r/   r0   r&   Úsin)ÚaÚbr1   r2   r   r4   r   r   r   Úgenz_malik_1980_f_1_exactK   s   &&ÿÿ,þýÿr=   c                 C   sR   |  |  |d d… ¡¡}|  |  |¡¡}d}|j|dd�d }|| | }||fS )Nr   é	   r#   ©.N©ÚasarrayÚrandomr&   )Úrngr,   r   r1   r2   Ú
difficultyÚnormalisation_factorsr   r   r   Úgenz_malik_1980_f_1_random_argsX   s   rF   c           	      C   sp   | j d | j d }}|d }|d }| | |gdgt|j ƒd  ¢|‘R ¡}d|j|d || d  dd� S )zì
    .. math:: f_2(\mathbf x) = \prod^n_{i = 1} (\alpha_i^2 + (x_i - \beta_i)^2)^{-1}

    .. code-block:: mathematica

        genzMalik1980f2[x_List, alphas_List, betas_List] :=
            1/Times @@ ((alphas^2 + (x - betas)^2))
    r   r   r+   r   r   r#   )r,   r   r-   r9   ©	r   r2   Úbetasr   r3   r4   r5   Úbetas_reshapedr   r   r   r   Úgenz_malik_1980_f_2c   s
   	("rJ   c                 C   s¤   t | ƒ}| | g dgt|jƒd  ¢|‘R ¡} | |g dgt|jƒd  ¢|‘R ¡}t| ƒ}d| d |j|dd� |j| | | | ¡| || | ¡ dd� S ©Nr   r   r#   )r   r   r-   r,   r   r9   Úatan)r;   r<   r2   rH   r   r4   Úxp_testr   r   r   Úgenz_malik_1980_f_2_exactv   s   &&"þÿÿrN   c           	      C   sŠ   |d }|  |  |¡¡}|  |  |¡¡}d}|j||  d¡ dd�}||  dd|  ¡ d }|| t |dd|  ¡ }|d9 }||fS )	Nr   g      9@g       Àr#   r   r   r?   é
   )rA   rB   r9   r/   Úpow)	rC   r,   r   r4   r2   rH   rD   ÚproductsrE   r   r   r   Úgenz_malik_1980_f_2_random_args‡   s   rR   c                 C   s^   | j d | j d }}|d }| | |gdgt|j ƒd  ¢|‘R ¡}| |j|| dd�¡S )z·
    .. math:: f_3(\mathbf x) = \exp\left(\sum^n_{i = 1} \alpha_i x_i\right)

    .. code-block:: mathematica

        genzMalik1980f3[x_List, alphas_List] := Exp[Dot[x, alphas]]
    r   r   r+   r   r#   ©r,   r   r-   Úexpr&   ©r   r2   r   r3   r4   r5   r   r   r   r   Úgenz_malik_1980_f_3˜   s   	(rV   c                 C   s”   t | ƒ}| | g dgt|jƒd  ¢|‘R ¡} | |g dgt|jƒd  ¢|‘R ¡}d| d |j|dd� |j| ||  ¡| || ¡ dd� S rK   )r   r   r-   r,   r9   rT   )r;   r<   r2   r   r4   r   r   r   Úgenz_malik_1980_f_3_exact©   s   &&$ÿÿrW   c                 C   s8   |  |  |¡¡}|j|dd�d }d}|| | }|fS )Nr   r#   r?   g      (@r@   )rC   r,   r   r2   rE   rD   r   r   r   Úgenz_malik_1980_f_3_random_args´   s
   rX   c                 C   sf   | j d | j d }}|d }| | |gdgt|j ƒd  ¢|‘R ¡}d|j|| dd� | d  S )zà
    .. math:: f_4(\mathbf x) = \left(1 + \sum^n_{i = 1} \alpha_i x_i\right)^{-n-1}

    .. code-block:: mathematica
        genzMalik1980f4[x_List, alphas_List] :=
            (1 + Dot[x, alphas])^(-Length[alphas] - 1)
    r   r   r+   r   r#   )r,   r   r-   r&   rU   r   r   r   Úgenz_malik_1980_f_4½   s   	( rY   c                    s&   t | ƒ‰‡ ‡‡fdd„}t|| |ˆƒS )Nc                    s\   ˆ  | g dgtˆ jƒd  ¢ˆ‘R ¡}dˆ ˆjˆ dd� t ˆ¡ dˆjˆ | dd�  S rK   )r   r-   r,   r9   r/   Ú	factorialr&   )r   r   ©r2   r4   r   r   r   ÚFÑ   s   &ÿþÿz$genz_malik_1980_f_4_exact.<locals>.F)r   Ú_eval_indefinite_integral)r;   r<   r2   r   r\   r   r[   r   Úgenz_malik_1980_f_4_exactÎ   s   	r^   c                    sz   t |ƒ}|j||gdd�‰ d}tjtdƒ|d�D ]"}| ‡ fdd„t|t|ƒƒD ƒ¡}|tdt|ƒ| ƒ| |ƒ 7 }q|S )z‡
    Calculates a definite integral from points `a` to `b` by summing up over the corners
    of the corresponding hyperrectangle.
    r   r#   r   )Úrepeatc                    s   g | ]
\}}ˆ ||f ‘qS r   r   )Ú.0ÚiÚj©Úpointsr   r   Ú
<listcomp>è   ó    z-_eval_indefinite_integral.<locals>.<listcomp>r   )	r   ÚstackÚ	itertoolsÚproductÚrangerA   ÚziprP   r&   )r\   r;   r<   r   r4   ÚoutÚindÚselected_pointsr   rc   r   r]   Ý   s   " r]   c                 C   sD   |d }|  |  |¡¡}|j|dd�d }d}|| | | }|fS )Nr   r#   r?   g      ,@r@   )rC   r,   r   r4   r2   rE   rD   r   r   r   Úgenz_malik_1980_f_4_random_argsî   s   ro   c           	      C   st   | j d | j d }}|d }|d }| | |gdgt|j ƒd  ¢|‘R ¡}| |j|d || d  dd� ¡S )zû
    .. math::

        f_5(\mathbf x) = \exp\left(-\sum^n_{i = 1} \alpha^2_i (x_i - \beta_i)^2\right)

    .. code-block:: mathematica

        genzMalik1980f5[x_List, alphas_List, betas_List] :=
            Exp[-Total[alphas^2 * (x - betas)^2]]
    r   r   r+   r   r   r#   rS   rG   r   r   r   Úgenz_malik_1980_f_5ù   s   (ÿrp   c                 C   s®   t | ƒ}| | g dgt|jƒd  ¢|‘R ¡} | |g dgt|jƒd  ¢|‘R ¡}d| d |j|dd� tj|d   |jtj 	|||   ¡tj 	|||  ¡ dd� S )Nr   r8   r   r#   r   )
r   r   r-   r,   r9   r/   r0   ÚscipyÚspecialÚerf)r;   r<   r2   rH   r   r4   r   r   r   Úgenz_malik_1980_f_5_exact  s$   &&ÿÿþÿýýÿrt   c                 C   s`   |  |  |¡¡}|  |  |¡¡}d}| |j||  d¡ dd�¡d }|| t |¡ }||fS )Ng      5@g       @r   r#   r?   )rA   rB   Úsqrtr&   r/   )rC   r,   r   r2   rH   rD   rE   r   r   r   Úgenz_malik_1980_f_5_random_args"  s   "rv   c                 C   sd   | j d | j d }}|d }| | |gdgt|j ƒd  ¢|‘R ¡}| |j|| d dd� ¡S )z^
    .. math::

        f(\mathbf x) = \exp\left(-\sum^n_{i = 1} (\alpha_i x_i)^2 \right)
    r   r   r+   r   r   r#   rS   rU   r   r   r   Ú
f_gaussian-  s   (rw   c                 C   sŽ   t | ƒ}d}d}t|ƒD ]'}| | | ¡r!| || ¡r!|d7 }q| | | ¡| || ¡kr3|d7 }qt tj¡| d| |j|dd�  S )Nr   r   r   r   r#   )r   rj   Úisinfr/   ru   r0   r9   )r;   r<   r2   r   r4   Údouble_infinite_countÚsemi_infinite_countra   r   r   r   Úf_gaussian_exact:  s   
€ÿr{   c                 C   s   |  |  |¡¡}|d9 }|fS )Néd   )rA   rB   )rC   r,   r   r2   r   r   r   Úf_gaussian_random_argsP  s   r}   c                 C   s„   | dd…df | dd…df | dd…df | dd…df f\}}}}||dd…df  |  |¡ | | |d  |d  ¡ }|jS )zJ
    .. math::

        f(x, y, z, w) = x^n \sqrt{y} \exp(-y-z^2-w^2)
    Nr   r   r   r(   )ru   rT   ÚT)Úx_arrr   r   r   ÚyÚzÚwÚresr   r   r   Úf_modified_gaussianZ  s   D:r„   c                 C   s   ddd|   t jd  S )Nr   r   g      ø?)r/   r0   )r;   r<   r   r   r   r   r   Úf_modified_gaussian_exactf  s   r…   c                 C   s0   |D ]}|  | |k¡rtdƒ‚q| | jd ¡S )zœ
    This emulates a function with a list of singularities given by `points`.

    If no `x_arr` are one of the `points`, then this function returns 1.
    úcalled with a problematic pointr   )ÚanyÚ
ValueErrorÚonesr,   )r   rd   r   Úpointr   r   r   Úf_with_problematic_pointsn  s
   ÿr‹   c                   @   sn   e Zd ZdZej dg d¢¡dd„ ƒZeddd�d	d
„ ƒZ	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚTestCubaturez7
    Tests related to the interface of `cubature`.
    Úrule_str)zgauss-kronrodú
genz-malikÚgk21Úgk15c                 C   sj   |j d|jd�}|jddg|jd�}|jddg|jd�}tt|||||fd�}t|jt||ƒddd� d S )Né   ©Údtyper   r   )ÚruleÚargsç:Œ0âŽyE>©ÚrtolÚatol)ÚarangeÚfloat64rA   r   r'   r   Úestimater*   )Úselfr�   r   r   r;   r<   rƒ   r   r   r   Útest_pass_str‚  s   
üzTestCubature.test_pass_strTz,array-likes only supported for NumPy backend)Únp_onlyÚreasonc                 C   sL   t jdt jd�}dg}dg}tt||||fd�}t|jt||ƒddd� d S )Nr‘   r’   r   r   ©r•   r–   r—   )r   rš   r›   r   r   r   rœ   r"   ©r�   r   r   r;   r<   rƒ   r   r   r   Útest_pass_array_like_not_array–  s   ü
üz+TestCubature.test_pass_array_like_not_arrayc              
   C   sb   |  dg¡}|  dg¡}tƒ }tt|||d|jd|jd�|fd�}|jdks(J ‚|jdks/J ‚d S )Nr   r   rO   r‘   r’   )r”   Úmax_subdivisionsr•   Únot_converged)rA   ÚBadErrorRuler   r   rš   r›   ÚsubdivisionsÚstatus)r�   r   r;   r<   r”   rƒ   r   r   r   Ú!test_stops_after_max_subdivisions«  s   ú	z.TestCubature.test_stops_after_max_subdivisionsc                 C   sn   |j dgg|jd�}|j dgg|jd�}tjtdd�� tt|||fd� W d   ƒ d S 1 s0w   Y  d S )Nr   r’   r   z`a` and `b` must be 1D arrays©Úmatchr¡   )rA   r›   ÚpytestÚraisesÚ	Exceptionr   r   ©r�   r   r;   r<   r   r   r   Útest_a_and_b_must_be_1d¼  s
   "ÿz$TestCubature.test_a_and_b_must_be_1dc                 C   sZ   |  g ¡}|  g ¡}tjtdd�� tt|||fd� W d   ƒ d S 1 s&w   Y  d S )Nz`a` and `b` must be nonemptyrª   r¡   )rA   r¬   r­   r®   r   r   r¯   r   r   r   Útest_a_and_b_must_be_nonemptyÃ  s
   

"ÿz*TestCubature.test_a_and_b_must_be_nonemptyc                 C   s~   |j d|jd�}|jdg|jd�}|jdg|jd�}tt||||fd�}t|j|jdgdgdgdgdgg|jd�ddd� d S )Nr‘   r’   r   r¡   r–   r—   )rš   r›   rA   r   r   r   rœ   r¢   r   r   r   Útest_zero_width_limitsÊ  s   ü"
üz#TestCubature.test_zero_width_limitsc                 C   sf   |j d|jd�}|jdg|jd�}|jdg|jd�}tt||||fd�}t|jt||ƒ ddd� d S )Nr‘   r’   r   r   r¡   r–   r—   )rš   r›   rA   r   r   r   rœ   r"   r¢   r   r   r   Útest_limits_other_way_aroundÞ  s   ü

üz)TestCubature.test_limits_other_way_aroundc              	   C   sú   t t|jdg|jd�|jdg|jd�g |jdg|jd�|fd�jj}||jks)J ‚t t|jdg|jd�|jdg|jd�g |jdg|jd�|fd�jj}||jksRJ ‚t t|jdg|jd�|jdg|jd�g |jdg|jd�|fd�jj}||jks{J ‚d S )Nr   r’   r   )rd   r•   )r   r   rA   r›   rœ   r“   Úfloat32)r�   r   Úresult_dtyper   r   r   Ú$test_result_dtype_promoted_correctlyò  s<   ûúûúûúz1TestCubature.test_result_dtype_promoted_correctlyN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r¬   ÚmarkÚparametrizerž   r   r£   r©   r°   r±   r²   r³   r¶   r   r   r   r   rŒ   |  s    
ÿ
rŒ   r˜   g-Cëâ6?r™   gñhãˆµøä>r”   )r�   r�   rŽ   c                   @   s\  e Zd ZdZej deedgdgddgffeeddgddgddd	gffeeddgddgd
dd	gffeeg d¢g d¢d
g d¢ffe	e
dgdgdgd	gffe	e
ddgddgddgddgffe	e
g d¢g d¢g d¢g d¢ffe	e
g d¢g d¢g d¢g d¢ffe	e
g d¢g d¢g d¢g d¢ffe	e
g d¢g d¢g d¢g d¢ffeedgdgd
gffeeddgddgddgffeeg d¢g d¢g d¢ffeedgdgdgffeeddgddgddgffeeg d¢g d¢g d¢ffeedgdgdgdgffeeddgddgddgd	dgffeeddgddgddgddgffeeg d¢g d¢g d¢g d¢ffg¡dd„ ƒZej deeefe	e
efeeefeeefeeefg¡ej dg d¢¡dd„ ƒƒZej ddd„ d gdgdgd!fd"d„ d#gdgdgd$ggfd%d„ d&gg d¢g d¢g d'¢gfd(d„ d&gg d¢g d¢g d)¢g d'¢gfd*d„ d&gg d¢g d¢g d+¢g d)¢g d'¢gfg¡d,d-„ ƒZed.d/gd0�ej deeed1ej gejgfeeed2ej ej gejejgfeeed1dgejgfeeed1ej gdgfeeed2ddgejejgfeeed2dej gejejgfeeed3ddej ej gejejejejgfeeed3ej ej ej ej gddejejgfd4d„ d5d„ d6d„ eƒ dej dgejdejgfej e!e"d7d„ eƒ ddej ej gdejejejgfejj#d8�g
¡d9d:„ ƒƒZ$ed.d/gd0�ej dd;d„ d<ej% gej gejgdggfd=d„ d<ej% ej dgejdgdd
ggfg¡d>d?„ ƒƒZ&d!S )@ÚTestCubatureProblemsz9
    Tests that `cubature` gives the correct answer.
    Úproblemr   rO   ç      Ð?r‘   r   r   r)   r8   )r   r   r   )r‘   r‘   r‘   ©r   r   r   r   é2   éýÿÿÿr(   r7   )r   r(   r)   )r   r   r   )r   r   r   )r   r   r   r   )r   r   r   r   c              	      sÖ   |\}}}}	}
ˆ j |ˆ jd�}ˆ j |	ˆ jd�}	t‡ fdd„|
D ƒƒ}
t|ƒ}|dkr3|dk r3t d¡ t|||	|||g |
¢ˆ ‘R d�}|jdksJJ ‚|j}|||	g|
¢ˆ ‘R Ž }t	||||d	|j
› d
|j› �d� d S )Nr’   c                 3   s    � | ]}ˆ j |ˆ jd �V  qdS )r’   N©rA   r›   )r`   Úarg©r   r   r   Ú	<genexpr>÷  s   € z:TestCubatureProblems.test_scalar_output.<locals>.<genexpr>rŽ   r   ú1Genz-Malik cubature does not support 1D integrals©r”   r˜   r™   r•   Ú	convergedúestimate_error=ú, subdivisions=©r˜   r™   Úerr_msg)rA   r›   Útupler   r¬   Úskipr   r¨   rœ   r   Úerrorr§   )r�   r¾   r”   r˜   r™   r   ÚfÚexactr;   r<   r•   r4   rƒ   ÚestÚ	exact_solr   rÅ   r   Útest_scalar_output  s6    U
ù

ûz'TestCubatureProblems.test_scalar_outputr,   )	©r   ©r(   )r)   )r   r   )r   r(   ©r   r)   )r(   r   )r(   r)   r   )r   r   r(   c              	   C   s>  t j d¡}|d }|dkr|dk rt d¡ |dkr%|dkr%tj d¡ |\}	}
}||||ƒ}|jdg| |jd	�}|jdg| |jd	�}t	|	|||||g |¢|‘R d
�}|j
}|
||g|¢|‘R Ž }t||||d|j› d|j› �d� d|j› d|j› d| |j
| ¡› �}|jdks‘J |ƒ‚|j
j|d d… ks�J ‚d S )Nr   r   rŽ   r   rÇ   r‘   ú!Gauss-Kronrod is slow in >= 5 dimr   r’   rÈ   rÊ   rË   rÌ   ú, subdivisions= ú, true_error=rÉ   )r   rB   Údefault_rngr¬   rÏ   r»   ÚslowrA   r›   r   rœ   r   rÐ   r§   Úabsr¨   r,   )r�   r¾   r”   r,   r˜   r™   r   rC   r4   rÑ   rÒ   Úrandom_argsr•   r;   r<   rƒ   rÓ   rÔ   rÍ   r   r   r   Útest_array_output  sF   ,

ù
û
ÿþz&TestCubatureProblems.test_array_outputc                 C   s   | S ©Nr   ©r   r   r   r   r   Ú<lambda>o  s    zTestCubatureProblems.<lambda>g      I@Nc                 C   s   |  | ¡|  S rá   ©r:   râ   r   r   r   rã   ~  s    gB¾sÂvi@g        c                 C   ó   |  | jd df¡S ©Nr   r   ©r‰   r,   râ   r   r   r   rã   ‡  ó    g      ð?)r8   r8   r8   c                 C   rå   ræ   rç   râ   r   r   r   rã   �  rè   )r¿   r¿   r¿   c                 C   rå   ræ   rç   râ   r   r   r   rã   š  rè   )gš™™™™™¹?r¿   r8   c              
      s  |\}}}}	}
ˆ j |ˆ jd�}ˆ j |	ˆ jd�}	ˆ j |ˆ jd�}|
d ur,‡ fdd„|
D ƒ}
t|ƒ}|dkr=|dk r=t d¡ |dkrK|dkrKtj d¡ t|||	||||
ˆ fd	�}t|j	|||d
|j
› d|j› �dd� d
|j
› d|j› dˆ  |j	| ¡› �}|jdks‡J |ƒ‚d S )Nr’   c                    ó   g | ]
}ˆ j |ˆ jd �‘qS ©r’   rÃ   ©r`   rŠ   rÅ   r   r   re   ­  rf   z:TestCubatureProblems.test_break_points.<locals>.<listcomp>rŽ   r   rÇ   r‘   rÙ   ©r”   r˜   r™   rd   r•   rÊ   rË   F)r˜   r™   rÍ   Úcheck_dtyperÚ   rÛ   rÉ   )rA   r›   r   r¬   rÏ   r»   rÝ   r   r   rœ   rÐ   r§   rÞ   r¨   )r�   r¾   r”   r˜   r™   r   rÑ   rÒ   r;   r<   rd   r4   rƒ   rÍ   r   rÅ   r   Útest_break_pointsl  sF   :
øú
	ÿþz&TestCubatureProblems.test_break_pointsú	jax.numpyú*transforms make use of indexing assignment©Úreasons)r   r   )r   r   rØ   c                 C   s   d|j | dd�d  S )Nr   r   r#   r   )r9   râ   r   r   r   rã     ó    c                 C   s   |j d|jd�S )NgUUUUUUÅ?r’   rÃ   )r;   r<   r   r   r   r   rã      s    c                 C   s   t ƒ S rá   )rÎ   ©rC   r,   r   r   r   r   rã   #  s    c                 C   s   |j g d¢|jd�fS )N)r   r   r   r(   r)   r’   rÃ   rô   r   r   r   rã   4  ró   )Úmarksc              	   C   s  t j d¡}|\}}}	}
}}|j||jd�}|j||jd�}|	||
|ƒ}t|ƒ}|dkr5|dk r5t d¡ |dkrC|dkrCtj 	d¡ |dkrU|dkrUt
|ƒrUtj d¡ t||||||g |¢|‘R d	�}|jd
kslJ ‚t|j|||g|¢|‘R Ž ||d|j› d|j› �dd� d S )Nr   r’   rŽ   r   rÇ   r)   zGenz-Malik is slow in >= 5 dimz5Genz-Malik very slow for array_api_strict in >= 4 dimrÈ   rÉ   úerror_estimate=rË   F©r˜   r™   rÍ   Úcheck_0d)r   rB   rÜ   rA   r›   r   r¬   rÏ   r»   rÝ   r   Úxslowr   r¨   r   rœ   rÐ   r§   )r�   r¾   r”   r˜   r™   r   rC   rÑ   rÒ   Úrandom_args_funcÚrandom_args_shaper;   r<   r•   r4   rƒ   r   r   r   Útest_infinite_limitsÐ  s<   o
ù

úz)TestCubatureProblems.test_infinite_limitsc                 C   s   |  | ¡|  d S )Né   rä   râ   r   r   r   rã   m  s    gßê­Þê­Þ?c                 C   s*   |  | d d …df ¡| d d …df  d S )Nr   rý   rä   râ   r   r   r   rã   |  s   * c              
      sÌ   |\}}}}	}
ˆ j |ˆ jd�}ˆ j |	ˆ jd�}	ˆ j |ˆ jd�}t|ƒ}|dkr0|dk r0t d¡ |
d ur=‡ fdd„|
D ƒ}
t|||	||||
ˆ fd�}|jdksQJ ‚t|j|||d	|j	› d
|j
› �dd� d S )Nr’   rŽ   r   rÇ   c                    ré   rê   rÃ   rë   rÅ   r   r   re   —  rf   zNTestCubatureProblems.test_infinite_limits_and_break_points.<locals>.<listcomp>rì   rÉ   rö   rË   Fr÷   )rA   r›   r   r¬   rÏ   r   r¨   r   rœ   rÐ   r§   )r�   r¾   r”   r˜   r™   r   rÑ   rÒ   r;   r<   rd   r4   rƒ   r   rÅ   r   Ú%test_infinite_limits_and_break_pointsf  s8   %
ø
úz:TestCubatureProblems.test_infinite_limits_and_break_points)'r·   r¸   r¹   rº   r¬   r»   r¼   r6   r=   rJ   rN   rV   rW   rY   r^   rp   rt   rÕ   rF   rR   rX   ro   rv   rà   rî   r   rw   r{   r}   r/   ÚinfrÎ   Úparamr„   r…   rù   rü   r0   rþ   r   r   r   r   r½     s„   	þòþûþûþûþûþúþûþûþûþûÿû
ÿû
ÿûÿû
ûû
þûþûþûþû �· 
T#øýýýýæ ,òÿû
ÿû
þûýûÓ
9+þó
ú	ú	ú	
ú	

ú	ú	ú	õôð©j(þ
ô
ôð r½   c                   @   sN   e Zd ZdZej dddgddgedfdgdgedfg¡dd„ ƒZ	d	d
„ Z
dS )Ú	TestRuleszJ
    Tests related to the general Rule interface (currently private).
    r¾   r   r   ©é   rÖ   c                 C   s‚   |\}}}}||d|iŽ}|j ||jd�}|j ||jd�}tjtdd�� |jt|||fd� W d   ƒ d S 1 s:w   Y  d S )Nr   r’   zincompatible dimensionrª   r¡   )rA   r›   r¬   r­   r®   rœ   r   )r�   r¾   r   r;   r<   Ú
quadratureÚquadrature_argsr”   r   r   r   Ú(test_incompatible_dimension_raises_error¶  s   "ÿz2TestRules.test_incompatible_dimension_raises_errorc              	   C   sl   |  dg¡}|  dg¡}tƒ tƒ fD ]!}t t¡� |jt|||fd� W d   ƒ n1 s.w   Y  qd S )Nr   r   r¡   )rA   r	   r
   r¬   r­   r®   rœ   r   )r�   r   r;   r<   Ú
base_classr   r   r   Ú+test_estimate_with_base_classes_raise_errorÐ  s   ÿ€ÿz5TestRules.test_estimate_with_base_classes_raise_errorN)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Zej dedfedfedfedfedfg¡dd	„ ƒZ	ej d
eefdfg¡dd„ ƒZ
ej deg¡dd„ ƒZdS )ÚTestRulesQuadraturez8
    Tests underlying quadrature rules (ndim == 1).
    )r”   Ú	rule_argsr×   )r‘   )rO   )é   r  c           
         sŽ   ||dˆiŽ}ˆj dˆjd�‰ ‡ ‡fdd„}ˆjdgˆjd�}ˆjdgˆjd�}ˆ dˆ d  ˆ d  d	¡}| |||¡}	t|	|d
dd� d S )Nr   r‘   r’   c                    s    ˆ  | d¡}ˆ  ˆ d¡}|| S r   r   )r   r   r   r!   r   r   rÑ   ë  r   z>TestRulesQuadrature.test_base_1d_quadratures_simple.<locals>.fr   r   r   r    r–   r—   )rš   r›   rA   r   rœ   r   )
r�   r”   r
  r   r  rÑ   r;   r<   rÒ   rœ   r   r!   r   Útest_base_1d_quadratures_simpleß  s   
üz3TestRulesQuadrature.test_base_1d_quadratures_simple)Ú	rule_pairÚrule_pair_args)rO   r‘   c                 C   sš   |j d|jd�}|jdg|jd�}|jdg|jd�}|d |d |d�}|d |d |d�}t||ƒ}	tt|||	d||fd�}
t|
jt||ƒddd	� d S )
Nr‘   r’   r   r   rÅ   r   r–   )r”   r˜   r•   r—   )	rš   r›   rA   r   r   r   r   rœ   r"   )r�   r  r  r   r   r;   r<   ÚhigherÚlowerr”   rƒ   r   r   r   Ú.test_base_1d_quadratures_error_from_differenceþ  s&   
û
üzBTestRulesQuadrature.test_base_1d_quadratures_error_from_differencer  c                 C   s<   t  t¡� |d|d� W d   ƒ d S 1 sw   Y  d S )Nr   rÅ   )r¬   r­   r®   )r�   r  r   r   r   r   Ú$test_one_point_fixed_quad_impossible  s   "ÿz8TestRulesQuadrature.test_one_point_fixed_quad_impossibleN)r·   r¸   r¹   rº   r¬   r»   r¼   r   r   r  r  r  r   r   r   r   r	  Ù  s$    û

ÿ
ÿr	  c                   @   s4   e Zd ZdZej deddƒ¡dd„ ƒZdd„ Z	d	S )
ÚTestRulesCubaturez6
    Tests underlying cubature rules (ndim >= 2).
    r4   r   é   c                 C   sD   t ||d�j\}}|jd d| d|d   d|  d ks J ‚dS )z“
        Tests that the number of function evaluations required for Genz-Malik cubature
        matches the number in Genz and Malik 1980.
        rÅ   r   r   r   N)r   Únodes_and_weightsr,   )r�   r4   r   ÚnodesÚ_r   r   r   Ú test_genz_malik_func_evaluations(  s   2z2TestRulesCubature.test_genz_malik_func_evaluationsc                 C   s@   t jtdd�� td|d� W d   ƒ d S 1 sw   Y  d S )Nzonly defined for ndim >= 2rª   r   rÅ   )r¬   r­   r®   r   )r�   r   r   r   r   Útest_genz_malik_1d_raises_error3  s   "ÿz1TestRulesCubature.test_genz_malik_1d_raises_errorN)
r·   r¸   r¹   rº   r¬   r»   r¼   rj   r  r  r   r   r   r   r  "  s
    

r  rï   rð   rñ   c                   @   sJ   e Zd Zej dddej gdejejgg d¢g d¢gfg¡dd„ ƒZdS )	ÚTestTransformations)r;   r<   rd   r   r   rÀ   )r8   rO   rO   c              	      s¨   t ˆ d¡ƒ‰‡fdd„ˆ D ƒ‰ t‡ ‡fdd„ˆj|ˆjd�ˆj|ˆjd�ˆd�}ˆ D ]&}| ˆ |d¡¡}tjt	d	d
�� ||ƒ W d  ƒ n1 sLw   Y  q+dS )zx
        Test that break points are correctly mapped under the _InfiniteLimitsTransform
        transformation.
        r   c                    ré   rê   rÃ   )r`   ÚprÅ   r   r   re   O  rf   zMTestTransformations.test_infinite_limits_maintains_points.<locals>.<listcomp>c                    s   t | ˆ ˆƒS rá   )r‹   )r   )rd   Ú	xp_compatr   r   rã   S  s    zKTestTransformations.test_infinite_limits_maintains_points.<locals>.<lambda>r’   rÅ   r%   r†   rª   N)
r   Úemptyr   rA   r›   Úinvr   r¬   r­   r®   )r�   r;   r<   rd   r   Úf_transformedrŠ   Útransformed_pointr   )rd   r   r  r   Ú%test_infinite_limits_maintains_points>  s   û
ÿ€ýz9TestTransformations.test_infinite_limits_maintains_pointsN)	r·   r¸   r¹   r¬   r»   r¼   r/   rÿ   r!  r   r   r   r   r  8  s    þýÿ
r  c                   @   s$   e Zd ZdZddd„Zddd„ZdS )	r¦   zP
    A rule with fake high error so that cubature will keep on subdividing.
    r   c                 C   s&   t ||ƒ}td|d�}| ||||¡S )NrO   rÅ   )r   r   rœ   )r�   rÑ   r;   r<   r•   r   Ú
underlyingr   r   r   rœ   e  s   
zBadErrorRule.estimatec                 C   s   t ||ƒ}|jd|jd�S )Ng    €„.Ar’   )r   rA   r›   )r�   rÑ   r;   r<   r•   r   r   r   r   Úestimate_errork  s   
zBadErrorRule.estimate_errorN)r   )r·   r¸   r¹   rº   rœ   r#  r   r   r   r   r¦   `  s    
r¦   )=r/   rq   rh   r¬   Úscipy._lib._array_apir   r   r   r   r   Úscipy.conftestr   Úscipy.integrater   Úscipy.integrate._rulesr	   r
   r   r   r   r   Úscipy.integrate._cubaturer   r»   ÚusefixturesÚ
pytestmarkr   r   r"   r'   r*   r6   r=   rF   rJ   rN   rR   rV   rW   rX   rY   r^   r]   ro   rp   rt   rv   rw   r{   r}   r„   r…   r‹   rŒ   r¼   r½   r  r	  r  r  r¦   r   r   r   r   Ú<module>   s~     		
      (Hþ#