
    bi                     D   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	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 ej,                  j.                  ZdZd Zd Zd	 Zd
 Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d Z/d Z0d Z1d  Z2 e
e       G d! d"             Z3 e
e      ej,                  ji                  d#d$g      ej,                  ji                  d%d&g      ej,                  ji                  d'g d(       G d) d*                                  Z5 G d+ d,      Z6 G d- d.      Z7 G d/ d0      Z8ej,                  j/                  d1e2      ej,                  j/                  d3e2       G d4 d5                    Z9 G d6 d7e      Z:y)8    N)array_namespacexp_assert_closexp_size	np_compatis_array_api_strictmake_xp_test_case)cubature)_InfiniteLimitsTransform)Rule	FixedRuleNestedFixedRuleGaussLegendreQuadratureGaussKronrodQuadratureGenzMalikCubaturez2JAX/Dask arrays do not support boolean assignment.c                 T    |j                  | d      }|j                  |d      }||z  S N)   r   )r   r   r   reshape)xnxp
x_reshaped
n_reshapeds        ^/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/scipy/integrate/tests/test_cubature.pybasic_1d_integrandr   "   s-    Az*JAz*Jz!!    c                 >    |j                  d| dz   z  | dz   z  d      S )N   r   r   r   r   r   r   s     r   basic_1d_integrand_exactr#   )   s#    ::a!A#h!ng..r   c                 n    |j                  |j                  | d      d      |j                  |d      z  S )Nr   axisr!   r   r   )r   sum)r   r   r   s      r   basic_nd_integrandr)   .   s0    ::bffQRf('2BJJq'4JJJr   c                 >    dd| z   z   dd| z   z  z   d| z   d| z   z  z  S )Nr          r    r"   s     r   basic_nd_integrand_exactr.   2   s0    1XIAaC AaC!A#;//r   c                 $   | j                   d   | j                   d   }}|d   }|j                  | |gdgt        |j                         dz
  z  |      }|j                  dt        j
                  z  |z  |j                  ||z  d      z         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   s           r   genz_malik_1980_f_1r;   7   s     GGAJTGY'OANA3FLL0AA0E+FNNOJ66!DGG)A+'C" MMNNr   c           	         t        |       }|j                  | g dgt        |j                        dz
  z  |      } |j                  |g dgt        |j                        dz
  z  |      }d|z  dz  |j	                  |d      z  |j                  dt        j                  z  |z  |j                  || |z   z  dz  d      z         z  |j	                  |j                  || |z
  z  dz        d      z  S )Nr   r   r%   r          ?)
r   r   r2   r1   prodr3   r4   r5   r(   sin)abr6   r7   r   r9   s         r   genz_malik_1980_f_1_exactrC   H   s    1:D


1<!c&,,/!34<t<=A


1<!c&,,/!34<t<=A 
d

	GGFG$	%
&&4771rvvf!ns&:vDD
E	F ''"&&1Q3)*'
4	5r   c                     |j                  | j                  |d d             }|j                  | j                  |            }d}|j                  |d      d   }||z  |z  }||fS )Nr   	   r%   .Nasarrayrandomr(   )rngr1   r   r6   r7   
difficultynormalisation_factorss          r   genz_malik_1980_f_1_random_argsrM   U   sm    


3::eCRj)*AZZ

5)*FJFF6F3I>& #88Fv;r   c                     | j                   d   | j                   d   }}|d   }|d   }|j                  | |gdgt        |j                         dz
  z  |      }d|j                  |dz  ||z
  dz  z   d      z  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   r0   r   r    r%   )r1   r   r2   r?   	r   r7   betasr   r8   r9   r:   betas_reshapedr   s	            r   genz_malik_1980_f_2rR   `   s     GGAJTGY'O9%NANA3FLL0AA0E+FNNOJRWW_a':n+Dq*HHrWRRRr   c                    t        |       }|j                  | g dgt        |j                        dz
  z  |      } |j                  |g dgt        |j                        dz
  z  |      }d|z  dz  |j	                  |d      z  |j	                  |j                  | |z
  |z        |j                  ||z
  |z        z
  d      z  S Nr   r   r%   )r   r   r2   r1   r?   atanrA   rB   r7   rP   r   r9   s         r   genz_malik_1980_f_2_exactrW   s   s    1:D


1<!c&,,/!34<t<=A


1<!c&,,/!34<t<=A 
d
QrwwvBw//
''GGQY&'"''1u9f2D*EE  
	
r   c                 j   |d   }|j                  | j                  |            }|j                  | j                  |            }d}|j                  ||j                  d      z  d      }||j                  dd|z  z        z  d   }||z  t        j                  |dd|z  z        z  }|dz  }||fS )	Nr   g      9@g       r%   r   r    rF   
   )rH   rI   r?   r4   pow)	rJ   r1   r   r9   r7   rP   rK   productsrL   s	            r   genz_malik_1980_f_2_random_argsr\      s    9DZZ

5)*FJJszz%()EJwwvrzz$//bw9H%rzz!qv,'??K++dhhz1$<.PPF bLF5=r   c                     | j                   d   | j                   d   }}|d   }|j                  | |gdgt        |j                         dz
  z  |      }|j                  |j	                  ||z  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   r0   r   r%   r1   r   r2   expr(   r   r7   r   r8   r9   r:   r   s          r   genz_malik_1980_f_3ra      sz     GGAJTGY'OANA3FLL0AA0E+FNNOJ66"&&:5B&?@@r   c                    t        |       }|j                  | g dgt        |j                        dz
  z  |      } |j                  |g dgt        |j                        dz
  z  |      }d|z  dz  |j	                  |d      z  |j	                  |j                  || z        |j                  ||z        z
  d      z  S rT   )r   r   r2   r1   r?   r_   )rA   rB   r7   r   r9   s        r   genz_malik_1980_f_3_exactrc      s    1:D


1<!c&,,/!34<t<=A


1<!c&,,/!34<t<=A 
d
QrwwvBw//
''"&&!$rvvfqj'99'
C	Dr   c                     |j                  | j                  |            }|j                  |d      d   }d}||z  |z  }|fS )Nr   r%   rF   g      (@rG   )rJ   r1   r   r7   rL   rK   s         r   genz_malik_1980_f_3_random_argsre      sN    ZZ

5)*FFF6F3I>J& #88F9r   c                     | j                   d   | j                   d   }}|d   }|j                  | |gdgt        |j                         dz
  z  |      }d|j                  ||z  d      z   | dz
  z  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   r0   r   r%   )r1   r   r2   r(   r`   s          r   genz_malik_1980_f_4rg      s     GGAJTGY'OANA3FLL0AA0E+FNNOJ3"==$qIIr   c                 H    t        |       fd}t        || |      S )Nc                     j                  | g dgt        j                        dz
  z        }dz  j                  d      z  t	        j
                        z  dj                  |z  d      z   z  S rT   )r   r2   r1   r?   r4   	factorialr(   )r   r   r7   r9   r   s     r   Fz$genz_malik_1980_f_4_exact.<locals>.F   s    ZZ#Iqc3v||+<q+@&A#ID#IJ
 $JrwwvBw//nnT"#266&:-B6779	
r   )r   _eval_indefinite_integral)rA   rB   r7   r   rk   r9   s     `` @r   genz_malik_1980_f_4_exactrm      s$    1:D
 %Q1b11r   c                 r   t        |      }|j                  ||gd      }d}t        j                  t	        d      |      D ]k  }|j                  t        |t	        |            D 	cg c]  \  }}	t        |||	f          c}	}      }
|t        dt        |      |z          | |
      z  z  }m |S c c}	}w )z
    Calculates a definite integral from points `a` to `b` by summing up over the corners
    of the corresponding hyperrectangle.
    r   r%   r    )repeatr   )
r   stack	itertoolsproductrangerH   zipfloatrZ   r(   )rk   rA   rB   r   r9   pointsoutindijselected_pointss              r   rl   rl      s     1:DXXq!f1X%F
C  q$7 =**-0eDk-BCTQU6!Q$< C
 	s2s3x$'!O*<<<	= J	 Ds   )B3c                     |d   }|j                  | j                  |            }|j                  |d      d   }d}||z  |z  |z  }|fS )Nr   r%   rF   g      ,@rG   )rJ   r1   r   r9   r7   rL   rK   s          r   genz_malik_1980_f_4_random_argsr}      s\    9DZZ

5)*FFF6F3I>J46),AAF9r   c                    | j                   d   | j                   d   }}|d   }|d   }|j                  | |gdgt        |j                         dz
  z  |      }|j                  |j	                  |dz  ||z
  dz  z  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   r0   r   r    r%   r^   rO   s	            r   genz_malik_1980_f_5r      s     GGAJTGY'O9%NANA3FLL0AA0E+FNNOJ66	"j>&AA%EEB	OO r   c           	         t        |       }|j                  | g dgt        |j                        dz
  z  |      } |j                  |g dgt        |j                        dz
  z  |      }d|z  dz  |j	                  |d      z  t
        j                  |dz  z  z  |j	                  t        j                  j                  ||| z
  z        t        j                  j                  |||z
  z        z   d      z  S )Nr   r>   r   r%   r    )
r   r   r2   r1   r?   r4   r5   scipyspecialerfrV   s         r   genz_malik_1980_f_5_exactr     s   1:D


1<!c&,,/!34<t<=A


1<!c&,,/!34<t<=A 
t
	GGFG$	%77T!V	 ''MMf	23mm!e) 456  
	
	r   c                 2   |j                  | j                  |            }|j                  | j                  |            }d}|j                  |j                  ||j                  d      z  d            d   }||z  t	        j                  |      z  }||fS )Ng      5@g       @r   r%   rF   )rH   rI   sqrtr(   r4   )rJ   r1   r   r7   rP   rK   rL   s          r   genz_malik_1980_f_5_random_argsr     s    ZZ

5)*FJJszz%()EJGGBFF62::c?+BF$LMiX++dii
.CCF5=r   c                     | j                   d   | j                   d   }}|d   }|j                  | |gdgt        |j                         dz
  z  |      }|j                  |j	                  ||z  dz  d             S )z^
    .. math::

        f(\mathbf x) = \exp\left(-\sum^n_{i = 1} (\alpha_i x_i)^2 \right)
    r   r   r0   r   r    r%   r^   r`   s          r   
f_gaussianr   )  s     GGAJTGY'OANA3FLL0AA0E+FNNOJ66266?Z7!;"6EEFFr   c                 z   t        |       }d}d}t        |      D ]_  }|j                  | |         r|j                  ||         r|dz  }1|j                  | |         |j                  ||         k7  s[|dz  }a t        j                  t        j
                        |z  d|z  |j                  |d      z  z  S )Nr   r   r    r   r%   )r   rs   isinfr4   r   r5   r?   )rA   rB   r7   r   r9   double_infinite_countsemi_infinite_country   s           r   f_gaussian_exactr   6  s     1:D4[ %88AaD>bhhqtn!Q&!XXad^rxx!~-1$	% IIdgg$&	b!99 r   c                 R    |j                  | j                  |            }|dz  }|fS )Nd   )rH   rI   )rJ   r1   r   r7   s       r   f_gaussian_random_argsr   L  s,    ZZ

5)*F cMF9r   c                     | dddf   | dddf   | dddf   | dddf   f\  }}}}||dddf   z  |j                  |      z  |j                  | |dz  z
  |dz  z
        z  }|j                  S )zJ
    .. math::

        f(x, y, z, w) = x^n \sqrt{y} \exp(-y-z^2-w^2)
    Nr   r   r    r+   )r   r_   T)x_arrr   r   r   yzwress           r   f_modified_gaussianr   V  s     q!teAqDk5A;adCJAq!Q!T'
?bggaj
(2661"QT'!Q$,+?
?C55Lr   c                 @    ddd|z  z   z  t         j                  dz  z  S )Nr   r    g      ?)r4   r5   )rA   rB   r   r   s       r   f_modified_gaussian_exactr   b  s$    
 a!A#g;S)))r   c                     |D ]!  }|j                  | |k(        st        d       |j                  | 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onesr1   )r   rv   r   points       r   f_with_problematic_pointsr   j  sJ      @66%5.!>??@ 775;;q>""r   c                       e Zd ZdZej
                  j                  dg d      d        Zd Zd Z	d Z
d Zd	 Zd
 Zd Zy)TestCubaturez7
    Tests related to the interface of `cubature`.
    rule_str)zgauss-kronrod
genz-malikgk21gk15c                 ,   |j                  d|j                        }|j                  ddg|j                        }|j                  ddg|j                        }t        t        |||||f      }t        |j                  t        ||      dd       y )N   dtyper   r    )ruleargs:0yE>rtolatol)arangefloat64rH   r	   r)   r   estimater.   )selfr   r   r   rA   rB   r   s          r   test_pass_strzTestCubature.test_pass_str~  s     IIarzzI*JJ1vRZZJ0JJ1vRZZJ0)1ahaWMLL$Q+		
r   c                     t        j                  dt         j                        }dg}dg}t        t        |||t         f      }t        |j                  t        |t               dd       y )Nr   r   r   r    r   r   r   )r   r   r   r	   r   r   r   r#   )r   r   rA   rB   r   s        r   test_pass_array_like_not_arrayz+TestCubature.test_pass_array_like_not_array  sc    Qi&7&78CCY	
 	LL$Q	2		
r   c                    |j                  dg      }|j                  dg      }t               }t        t        |||d|j	                  d|j
                        |f      }|j                  dk(  sJ |j                  dk(  sJ y )Nr   r   rY   r   r   )r   max_subdivisionsr   not_converged)rH   BadErrorRuler	   r   r   r   subdivisionsstatus)r   r   rA   rB   r   r   s         r   !test_stops_after_max_subdivisionsz.TestCubature.test_stops_after_max_subdivisions  s    JJsOJJsO~))ARZZ)0"5
 2%%%zz_,,,r   c                    |j                  dgg|j                        }|j                  dgg|j                        }t        j                  t        d      5  t        t        |||f       d d d        y # 1 sw Y   y xY w)Nr   r   r   z`a` and `b` must be 1D arraysmatchr   )rH   r   pytestraises	Exceptionr	   r   r   r   rA   rB   s       r   test_a_and_b_must_be_1dz$TestCubature.test_a_and_b_must_be_1d  sk    JJuBJJJ/JJuBJJJ/]]9,KL 	;'ARE:	; 	; 	;s   A88Bc                     |j                  g       }|j                  g       }t        j                  t        d      5  t	        t
        |||f       d d d        y # 1 sw Y   y xY w)Nz`a` and `b` must be nonemptyr   r   )rH   r   r   r   r	   r   r   s       r   test_a_and_b_must_be_nonemptyz*TestCubature.test_a_and_b_must_be_nonempty  sQ    JJrNJJrN]]9,JK 	;'ARE:	; 	; 	;s   AA%c           
      \   |j                  d|j                        }|j                  dg|j                        }|j                  dg|j                        }t        t        ||||f      }t        |j                  |j                  dgdgdgdgdgg|j                        dd       y )Nr   r   r   r   r   r   )r   r   rH   r	   r   r   r   r   r   r   rA   rB   r   s         r   test_zero_width_limitsz#TestCubature.test_zero_width_limits  s    IIarzzI*JJs"**J-JJs"**J-R	
 	LLJJaS1#sQC0

JC		
r   c                 (   |j                  d|j                        }|j                  dg|j                        }|j                  dg|j                        }t        t        ||||f      }t        |j                  t        ||       dd       y )Nr   r   r    r   r   r   r   )r   r   rH   r	   r   r   r   r#   r   s         r   test_limits_other_way_aroundz)TestCubature.test_limits_other_way_around  s    IIarzzI*JJs"**J-JJs"**J-R	
 	LL%a,,		
r   c           
      ^   t        t        |j                  dg|j                        |j                  dg|j                        g |j                  dg|j                        |f      j                  j
                  }||j                  k(  sJ t        t        |j                  dg|j                        |j                  dg|j                        g |j                  dg|j                        |f      j                  j
                  }||j                  k(  sJ t        t        |j                  dg|j                        |j                  dg|j                        g |j                  dg|j                        |f      j                  j
                  }||j                  k(  sJ y )Nr   r   r   )rv   r   )r	   r   rH   r   r   r   float32)r   r   result_dtypes      r   $test_result_dtype_promoted_correctlyz1TestCubature.test_result_dtype_promoted_correctly  sm   JJs"**J-JJs"**J-**aS

*3R8
 (55 	 rzz)))JJs"**J-JJs"**J-**aS

*3R8
 (55 	 rzz)))JJs"**J-JJs"**J-**aS

*3R8
 (55 	 rzz)))r   N)__name__
__module____qualname____doc__r   markparametrizer   r   r   r   r   r   r   r   r-   r   r   r   r   x  sT     [[Z * 


&-";;
(
(*r   r   r   g-C6?r   gh㈵>r   )r   r   r   c                   
   e Zd ZdZ edd      ej                  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               Z edd      ej                  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                  j                  dg d      d                      Zej                  j                  dd d gdgdgd!fd" d#gdgdgd$ggfd% d&gg dg dg d'gfd( d&gg dg dg d)g d'gfd* d&gg dg dg d+g d)g d'gfg      d,        Zej                  j	                  d-e      ej                  j	                  de      ej                  j                  deeed.ej>                   gej>                  gfeeed/ej>                   ej>                   gej>                  ej>                  gfeeed.dgej>                  gfeeed.ej>                   gdgfeeed/ddgej>                  ej>                  gfeeed/dej>                   gej>                  ej>                  gfeeed0ddej>                   ej>                   gej>                  ej>                  ej>                  ej>                  gfeeed0ej>                   ej>                   ej>                   ej>                   gddej>                  ej>                  gfd1 d2 d3  e        d
ej>                   dgej>                  dej>                  gf ejB                  e"e#d4  e        ddej>                   ej>                   gd
ej>                  ej>                  ej>                  gfej                  jH                  5      g
      d6                      Z%ej                  j	                  d-e      ej                  j	                  de      ej                  j                  dd7 d8ejL                  z  gej>                   gej>                  gdggfd9 d8ejL                  z  ej>                   dgej>                  d
gddggfg      d:                      Z'y!);TestCubatureProblemsz9
    Tests that `cubature` gives the correct answer.
    
dask.arrayz0Dask hangs/takes a long time for some test casesreasonproblemr   rY         ?r   r   r    r,   r>   )r   r   r   )r   r   r   r   r   r   r   2   r+   r=   )r    r+   r,   )r   r   r   )r    r    r    )r   r   r   r   )r   r   r   r   c           
         |\  }}}}	}
j                  |j                        }j                  |	j                        }	t        fd|
D              }
t        |      }|dk(  r|dk  rt	        j
                  d       t        |||	|||g |
      }|j                  dk(  sJ |j                  } |||	g|
 }t        ||||d|j                   d	|j                   
       y )Nr   c              3   X   K   | ]!  }j                  |j                          # yw)r   NrH   r   ).0argr   s     r   	<genexpr>z:TestCubatureProblems.test_scalar_output.<locals>.<genexpr>  s"     G3RZZ2::Z6Gs   '*r   r    1Genz-Malik cubature does not support 1D integralsr   r   r   r   	convergedestimate_error=, subdivisions=r   r   err_msg)rH   r   tupler   r   skipr	   r   r   r   errorr   )r   r   r   r   r   r   fexactrA   rB   r   r9   r   est	exact_sols        `         r   test_scalar_outputz'TestCubatureProblems.test_scalar_output  s    l  '5!QJJq

J+JJq

J+G$GGqz<D1HKKKL4
 zz[(((ll!Q**r*	%cii[@P@P?QR	
r   r1   )	r    r+   )r,   )r   r    )r   r+   r   r,   )r+   r    )r+   r,   r    )r    r   r+   c           
         t         j                  j                  d      }|d   }|dk(  r|dk  rt        j                  d       |dk(  r$|dk\  rt        j
                  j                  d       |\  }	}
} ||||      }|j                  dg|z  |j                  	      }|j                  dg|z  |j                  	      }t        |	|||||g ||
      }|j                  } |
||g|| }t        ||||d|j                   d|j                          d|j                   d|j                   d|j                  |j                  |z
         }|j                  dk(  sJ |       |j                  j                   |d d k(  sJ y )Nr   r   r   r    r   r   !Gauss-Kronrod is slow in >= 5 dimr   r   r   r   r   r   , subdivisions= , true_error=r   )r   rI   default_rngr   r   r   slowrH   r   r	   r   r   r   r   absr   r1   )r   r   r   r1   r   r   r   rJ   r9   r   r   random_argsr   rA   rB   r   r   r   r   s                      r   test_array_outputz&TestCubatureProblems.test_array_output  s   \ **1-Ry<D1HKKKL<DAIKK@A '5+3r*JJsTzJ4JJsTzJ44
 ll!Q**r*	%cii[@P@P?QR	
 %SYYK 0$$'$4$4#5 6!!#y(@!A BD zz[(1'1(||!!U3BZ///r   c                     | S Nr-   r   r   s     r   <lambda>zTestCubatureProblems.<lambda>m  s    ! r   g      I@Nc                 *    |j                  |       | z  S r  r@   r  s     r   r	  zTestCubatureProblems.<lambda>|  s    "&&)A+ r   gBsvi@g        c                 B    |j                  | j                  d   df      S Nr   r   r   r1   r  s     r   r	  zTestCubatureProblems.<lambda>      "''1771:q/2 r   g      ?)r>   r>   r>   c                 B    |j                  | j                  d   df      S r  r  r  s     r   r	  zTestCubatureProblems.<lambda>  r  r   )r   r   r   c                 B    |j                  | j                  d   df      S r  r  r  s     r   r	  zTestCubatureProblems.<lambda>  r  r   )g?r   r>   c           
         |\  }}}}	}
|j                  ||j                        }|j                  |	|j                        }	|j                  ||j                        }|
*|
D cg c]  }|j                  ||j                        ! }
}t        |      }|dk(  r|dk  rt        j                  d       |dk(  r$|dk\  rt        j
                  j                  d       t        |||	||||
|f      }t        |j                  |||d|j                   d	|j                   d
       d|j                   d|j                   d|j                  |j                  |z
         }|j                  dk(  sJ |       y c c}w )Nr   r   r    r   r   r   r   r   r   rv   r   r   r   F)r   r   r   check_dtyper   r   r   )rH   r   r   r   r   r   r  r	   r   r   r   r   r  r   )r   r   r   r   r   r   r   r   rA   rB   rv   r   r9   r   r   s                  r   test_break_pointsz&TestCubatureProblems.test_break_pointsj  s   t ")5!QJJq

J+JJq

J+

5


3GMNebjjbjjj9NFNqz<D1HKKKL<DAIKK@A	
 	LL%cii[@P@P?QR	
 %SYYK 0$$'$4$4#5 6!!#u(<!= >@ zz[(1'1(C Os   &$E:	jax.numpy)r   r   )r    r    r   c                 4    d|j                  | d      dz  z  S )Nr   r   r%   r    )r?   r  s     r   r	  zTestCubatureProblems.<lambda>  s    !BGGABG/22 r   c                 <    |j                  d|j                        S )NgUUUUUU?r   r   )rA   rB   r   s      r   r	  zTestCubatureProblems.<lambda>  s    RZZ2::Z> r   c                     t               S r  )r   rJ   r1   r   s      r   r	  zTestCubatureProblems.<lambda>  s    57 r   c                 B    |j                  g d|j                        fS )N)r   r   r    r+   r,   r   r   r  s      r   r	  zTestCubatureProblems.<lambda>0  s    

?"**
(U'W r   )marksc           
         t         j                  j                  d      }|\  }}}	}
}}|j                  ||j                        }|j                  ||j                        } |	||
|      }t        |      }|dk(  r|dk  rt        j                  d       |dk(  r$|dk\  rt        j                  j                  d       |dk(  r/|dk\  r*t        |      rt        j                  j                  d       t        ||||||g ||	      }|j                  d
k(  sJ t        |j                   |||g|| ||d|j                    d|j"                   d       y )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   rI   r  rH   r   r   r   r   r   r  r   xslowr	   r   r   r   r   r   )r   r   r   r   r   r   rJ   r   r   random_args_funcrandom_args_shaperA   rB   r   r9   r   s                   r   test_infinite_limitsz)TestCubatureProblems.test_infinite_limits  sZ   Z **1->E;5"$5q!JJq

J+JJq

J+%6;qz<D1HKKKL<DAIKK=><DAI2Eb2IKKUV4
 zz[(((LL!Q""r"%cii[@P@P?QR	
r   c                 0    |j                  |       | z  dz  S )N   r  r  s     r   r	  zTestCubatureProblems.<lambda>g  s    266!9q=1, r   g?c                 L    |j                  | d d df         | d d df   z  dz  S )Nr   r&  r  r  s     r   r	  zTestCubatureProblems.<lambda>v  s(    266!AqD'?Qq!tW4q8 r   c           
      ,   |\  }}}}	}
|j                  ||j                        }|j                  |	|j                        }	|j                  ||j                        }t        |      }|dk(  r|dk  rt        j                  d       |
*|
D cg c]  }|j                  ||j                        ! }
}t        |||	||||
|f      }|j                  dk(  sJ t        |j                  |||d|j                   d|j                   d	
       y c c}w )Nr   r   r    r   r  r   r  r   Fr  )rH   r   r   r   r   r	   r   r   r   r   r   )r   r   r   r   r   r   r   r   rA   rB   rv   r9   r   r   s                 r   %test_infinite_limits_and_break_pointsz:TestCubatureProblems.test_infinite_limits_and_break_pointsb  s   F ")5!QJJq

J+JJq

J+

5


3qz<D1HKKKLGMNebjjbjjj9NFN	
 zz[(((LL%cii[@P@P?QR	
 Os   $D)(r   r   r   r   skip_xp_backendsr   r   r   r;   rC   rR   rW   ra   rc   rg   rm   r   r   r   rM   r\   re   r}   r   r  r  boolean_index_skip_reasonr   r   r   r4   infr   paramr   r   r!  r$  r5   r)  r-   r   r   r   r     s*    lOQ[[Y   & C D 	
(  %FFA		
  %FFA		
  %		
  %DC		
  %FHQQ
	
  %		
  %		
  %		
  %		
  %DC	
  %GFA	
  %	
  %CC	
  %FFVI	
  %L	
  %DC		
  %HFAA		
  %HFQA		
  %		
QR) Rf!
gRQj!
F lOQ[[Y   & ,		
  %+	
  %+	
  %+	
  %+	
5) @ [[W 
' 
*0
AQZ*0X [[Y  F C D 	
" &DC	
 3E	
 3E"		
 3E "
	
[8) 8r)2s8r)2V [[!!+6O!P[[!!,7P!Q[[Y   # hhYKXXJ	
  "hhY	"XXtxx 	
 "CXXJ	
 "hhYKC	
 "FXXtxx 	
 "	NXXtxx 	
 "DHH9txxi(XXtxx4884	
 "hhY	DHH9txxi8488TXX&	
 3 ? +G	1XXr488$	
 	 $ * XAy488),DHHdhh1 ++##!	
oi) iT&
Ui R QX&
P [[!!+6O!P[[!!,7P!Q[[Y - tww hhYKXXJ SE	
" 9 dgg hhYNXXqM XJ	
!) @#
A R QD#
r   r   c                   z    e Zd ZdZej
                  j                  dddgddgedfdgdgedfg      d        Z	d Z
y	)
	TestRuleszJ
    Tests related to the general Rule interface (currently private).
    r   r   r      r   c                 *   |\  }}}} ||d|i}|j                  ||j                        }|j                  ||j                        }t        j                  t        d      5  |j                  t        |||f       d d d        y # 1 sw Y   y xY w)Nr   r   zincompatible dimensionr   r   )rH   r   r   r   r   r   r   )r   r   r   rA   rB   
quadraturequadrature_argsr   s           r   (test_incompatible_dimension_raises_errorz2TestRules.test_incompatible_dimension_raises_error  s    " -4)1j/?2r2JJq

J+JJq

J+]]9,DE 	@MM,a"M?	@ 	@ 	@s   %B		Bc                    |j                  dg      }|j                  dg      }t               t               fD ]>  }t        j                  t
              5  |j                  t        |||f       d d d        @ y # 1 sw Y   KxY w)Nr   r   r   )rH   r   r   r   r   r   r   r   )r   r   rA   rB   
base_classs        r   +test_estimate_with_base_classes_raise_errorz5TestRules.test_estimate_with_base_classes_raise_error  s    JJsOJJsO69;/ 	JJy) J##$61B5#IJ J	JJ Js   A;;B	N)r   r   r   r   r   r   r   r   r   r5  r8  r-   r   r   r/  r/    sk     [[Y FF"	
 CC	
)  @! @Jr   r/  c            	          e Zd ZdZej
                  j                  dedfedfedfedfedfg      d        Z	ej
                  j                  d	eefd
fg      d        Z
ej
                  j                  deg      d        Zy)TestRulesQuadraturez8
    Tests underlying quadrature rules (ndim == 1).
    )r   	rule_argsr   )r   )rY   )   r0  c                 V  
  ||di}j                  dj                        

fd}j                  dgj                        }j                  dgj                        }j                  d
dz   z  
dz   z  d      }|j	                  |||      }	t        |	|d	d
       y )Nr   r   r   c                 V    j                  | d      }j                  d      }||z  S r   r   )r   r   r   r   r   s      r   r   z>TestRulesQuadrature.test_base_1d_quadratures_simple.<locals>.f  s.    Az2JAz2Jz))r   r   r    r   r!   r   r   )r   r   rH   r   r   r   )r   r   r;  r   r3  r   rA   rB   r   r   r   s      `      @r   test_base_1d_quadratures_simplez3TestRulesQuadrature.test_base_1d_quadratures_simple  s     9,,
IIarzzI*	* JJs"**J-JJs"**J-

1qs8QqS>73&&q!Q/		
r   )	rule_pairrule_pair_args)rY   r   c           	         |j                  d|j                        }|j                  dg|j                        }|j                  dg|j                        } |d   |d   |      } |d   |d   |      }t        ||      }	t	        t
        |||	d||f      }
t        |
j                  t        ||      dd	       y )
Nr   r   r   r    r   r   r   )r   r   r   r   )	r   r   rH   r   r	   r   r   r   r#   )r   r@  rA  r   r   rA   rB   higherlowerr   r   s              r   .test_base_1d_quadratures_error_from_differencezBTestRulesQuadrature.test_base_1d_quadratures_error_from_difference  s    
 IIarzzI*JJs"**J-JJs"**J-1nQ/B7	!^A.26vu-qR
 	LL$Q+		
r   r3  c                 t    t        j                  t              5   |d|       d d d        y # 1 sw Y   y xY w)Nr   rC  )r   r   r   )r   r3  r   s      r   $test_one_point_fixed_quad_impossiblez8TestRulesQuadrature.test_one_point_fixed_quad_impossible  s/     ]]9% 	!qR 	! 	! 	!s   .7N)r   r   r   r   r   r   r   r   r   r?  rF  rH  r-   r   r   r:  r:    s     [[2	 $'	 $'	 %(	'	'5 

0 [[<
!#:	;WE? 

2 [[\, !!r   r:  c                   h    e Zd ZdZej
                  j                  d edd            d        Zd Z	y)TestRulesCubaturez6
    Tests underlying cubature rules (ndim >= 2).
    r9   r       c                     t        ||      j                  \  }}|j                  d   d|z  d|dz  z  z   d|z  z   dz   k(  sJ y)z
        Tests that the number of function evaluations required for Genz-Malik cubature
        matches the number in Genz and Malik 1980.
        rC  r   r    r   N)r   nodes_and_weightsr1   )r   r9   r   nodes_s        r    test_genz_malik_func_evaluationsz2TestRulesCubature.test_genz_malik_func_evaluations  sO     %Tb1CCq{{1~!T'QtQwY!64!?!!CCCCr   c                 ~    t        j                  t        d      5  t        d|       d d d        y # 1 sw Y   y xY w)Nzonly defined for ndim >= 2r   r   rC  )r   r   r   r   )r   r   s     r   test_genz_malik_1d_raises_errorz1TestRulesCubature.test_genz_malik_1d_raises_error*  s0    ]]9,HI 	(aB'	( 	( 	(s   3<N)
r   r   r   r   r   r   r   rs   rP  rR  r-   r   r   rJ  rJ    s9     [[VU1b\2D 3D(r   rJ  r  r   r   c                       e Zd Zej                  j                  dddej                   gdej                  ej                  gg dg dgfg      d        Zy)TestTransformations)rA   rB   rv   r   r   r   )r>   rY   rY   c                    D cg c]  }j                  |j                        ! c}t        fdj                  |j                        j                  |j                              }D ]O  }|j                  j	                  |d            }t        j                  t        d      5   ||       ddd       Q yc c}w # 1 sw Y   axY w)zx
        Test that break points are correctly mapped under the _InfiniteLimitsTransform
        transformation.
        r   c                     t        |       S r  )r   )r   rv   r   s    r   r	  zKTestTransformations.test_infinite_limits_maintains_points.<locals>.<lambda>F  s    /62> r   rC  r'   r   r   N)rH   r   r
   invr   r   r   r   )	r   rA   rB   rv   r   pf_transformedr   transformed_points	      ``    r   %test_infinite_limits_maintains_pointsz9TestTransformations.test_infinite_limits_maintains_points2  s      <BBa"**Qbjj*1B0>JJq

J+JJq

J+
  	1E - 1 1"**UG2L My0QR 1/01 1	1 C1 1s   $C8	CC	N)	r   r   r   r   r   r   r4   r,  r[  r-   r   r   rT  rT  /  s_     [[1DHH9$((#	
	4 	1	1r   rT  c                        e Zd ZdZddZddZy)r   zP
    A rule with fake high error so that cubature will keep on subdividing.
    c                 \    t        ||      }t        d|      }|j                  ||||      S )NrY   rC  )r   r   r   )r   r   rA   rB   r   r   
underlyings          r   r   zBadErrorRule.estimateX  s1    Q",RB7
""1aD11r   c                 T    t        ||      }|j                  d|j                        S )Ng    .Ar   )r   rH   r   )r   r   rA   rB   r   r   s         r   estimate_errorzBadErrorRule.estimate_error^  s%    Q"zz#RZZz00r   N)r-   )r   r   r   r   r   r`  r-   r   r   r   r   S  s    21r   r   );r4   r   rq   r   scipy._lib._array_apir   r   r   r   r   r   scipy.integrater	   scipy.integrate._cubaturer
   scipy.integrate._rulesr   r   r   r   r   r   r   r*  r+  r   r#   r)   r.   r;   rC   rM   rR   rW   r\   ra   rc   re   rg   rm   rl   r}   r   r   r   r   r   r   r   r   r   r   r   r   r/  r:  rJ  rT  r   r-   r   r   <module>re     s        % >  ;;// P "/
K0
O"
S&"A"J"2&0"
G,	*# 8P* P* P*f 8$($( " 
S

 S

 ) ) S

l%J %JPE! E!P( (* k2KLl3LM1 1 N M1D14 1r   