o
    `^h                     @   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   a/home/air/shanriGPT/back/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 )Nd   )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:0yE>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   gh㈵>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sJ ||j
j|d d ksJ 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    gBsvi@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sJ |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#