
    ЏkhŐ                        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 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 Z/d Z0d  Z1 G d! d"      Z2ej*                  jg                  d#d$g      ej*                  jg                  d%d&g      ej*                  jg                  d'g d(       G d) d*                           Z4 G d+ d,      Z5 G d- d.      Z6 G d/ d0      Z7ej*                  j-                  d1e2      ej*                  j-                  d3e2       G d4 d5                    Z8 G d6 d7e      Z9y)8    N)array_namespacexp_assert_closexp_size	np_compatis_array_api_strict)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        _/var/www/teggl/fontify/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-   1   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:   6   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   r1   r0   prodr2   r3   r4   r'   sin)abr5   r6   r   r8   s         r   genz_malik_1980_f_1_exactrB   G   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'   )rngr0   r   r5   r6   
difficultynormalisation_factorss          r   genz_malik_1980_f_1_random_argsrL   T   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   r/   r   r   r$   )r0   r   r1   r>   	r   r6   betasr   r7   r8   r9   betas_reshapedr   s	            r   genz_malik_1980_f_2rQ   _   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   r1   r0   r>   atanr@   rA   r6   rO   r   r8   s         r   genz_malik_1980_f_2_exactrV   r   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   rE   
   )rG   rH   r>   r3   pow)	rI   r0   r   r8   r6   rO   rJ   productsrK   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   r/   r   r$   r0   r   r1   expr'   r   r6   r   r7   r8   r9   r   s          r   genz_malik_1980_f_3r`      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 rS   )r   r   r1   r0   r>   r^   )r@   rA   r6   r   r8   s        r   genz_malik_1980_f_3_exactrb      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$   rE   g      (@rF   )rI   r0   r   r6   rK   rJ   s         r   genz_malik_1980_f_3_random_argsrd      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   r/   r   r$   )r0   r   r1   r'   r_   s          r   genz_malik_1980_f_4rf      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 rS   )r   r1   r0   r>   r3   	factorialr'   )r   r   r6   r8   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)r@   rA   r6   r   rj   r8   s     `` @r   genz_malik_1980_f_4_exactrl      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rangerG   zipfloatrY   r'   )rj   r@   rA   r   r8   pointsoutindijselected_pointss              r   rk   rk      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$   rE   g      ,@rF   )rI   r0   r   r8   r6   rK   rJ   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   r/   r   r   r$   r]   rN   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   r1   r0   r>   r3   r4   scipyspecialerfrU   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$   rE   )rG   rH   sqrtr'   r3   )rI   r0   r   r6   rO   rJ   rK   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   r/   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   rr   isinfr3   r   r4   r>   )r@   rA   r6   r   r8   double_infinite_countsemi_infinite_countrx   s           r   f_gaussian_exactr   5  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   )rG   rH   )rI   r0   r   r6   s       r   f_gaussian_random_argsr   K  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   U  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      ?)r3   r4   )r@   rA   r   r   s       r   f_modified_gaussian_exactr   a  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onesr0   )r   ru   r   points       r   f_with_problematic_pointsr   i  sJ      @66%5.!>??@ 775;;q>""r   c                       e Zd ZdZej
                  j                  dg d      d        Z edd      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float64rG   r   r(   r   estimater-   )selfr   r   r   r@   rA   r   s          r   test_pass_strzTestCubature.test_pass_str|  s     IIarzzI*JJ1vRZZJ0JJ1vRZZJ0)1ahaWMLL$Q+		
r   Tz,array-likes only supported for NumPy backend)np_onlyreasonc                     t        j                  dt         j                        }dg}dg}t        t        ||||f      }t        |j                  t        ||      dd       y )Nr   r   r   r   r   r   r   )r   r   r   r   r   r   r   r"   r   r   r   r@   rA   r   s         r   test_pass_array_like_not_arrayz+TestCubature.test_pass_array_like_not_array  se     Qi&7&78CCR	
 	LL$Q+		
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   rX   r   r   )r   max_subdivisionsr   not_converged)rG   BadErrorRuler   r   r   r   subdivisionsstatus)r   r   r@   rA   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   )rG   r   pytestraises	Exceptionr   r   r   r   r@   rA   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   )rG   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   rG   r   r   r   r   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   rG   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   )ru   r   )r   r   rG   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   skip_xp_backendsr   r   r   r   r   r   r   r,   r   r   r   r   w  so     [[Z * 

 dKM
M
&-";;
(
(*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r   problemr   rX         ?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rG   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)rG   r   tupler   r   skipr   r   r   r   errorr   )r   r   r   r   r   r   fexactr@   rA   r   r8   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   r0   )	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   rH   default_rngr   r   r   slowrG   r   r   r   r   r   r   absr   r0   )r   r   r   r0   r   r   r   rI   r8   r   r   random_argsr   r@   rA   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>l  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   r0   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   ru   r   r   r   F)r   r   r   check_dtyper   r  r   )rG   r   r   r   r   r   r  r   r   r   r   r   r  r   )r   r   r   r   r   r   r   r   r@   rA   ru   r   r8   r   r   s                  r   test_break_pointsz&TestCubatureProblems.test_break_pointsi  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   )r@   rA   r   s      r   r
  zTestCubatureProblems.<lambda>  s    RZZ2::Z> r   c                     t               S r  )r   rI   r0   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>/  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   rH   r  rG   r   r   r   r   r   r  r   xslowr   r   r   r   r   r   )r   r   r   r   r   r   rI   r   r   random_args_funcrandom_args_shaper@   rA   r   r8   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>f  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>u  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   )rG   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r@   rA   ru   r8   r   r   s                 r   %test_infinite_limits_and_break_pointsz:TestCubatureProblems.test_infinite_limits_and_break_pointsa  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   r   r   r   r   r:   rB   rQ   rV   r`   rb   rf   rl   r~   r   r   rL   r[   rd   r|   r   r  r  boolean_index_skip_reasonr   r   r   r3   infr   paramr   r   r"  r%  r4   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   )rG   r   r   r   r   r   r   )r   r   r   r@   rA   
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   )rG   r
   r   r   r   r   r   r   )r   r   r@   rA   
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   )rX   )   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   rG   r   r   r   )r   r   r;  r   r3  r   r@   rA   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)rX   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   rG   r   r   r   r   r   r"   )r   r@  rA  r   r   r@   rA   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).
    r8   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_weightsr0   )r   r8   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   rr   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)r@   rA   ru   r   r   r   )r=   rX   rX   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   ru   r   s    r   r
  zKTestTransformations.test_infinite_limits_maintains_points.<locals>.<lambda>E  s    /62> r   rC  r&   r   r   N)rG   r   r	   invr   r   r   r   )	r   r@   rA   ru   r   pf_transformedr   transformed_points	      ``    r   %test_infinite_limits_maintains_pointsz9TestTransformations.test_infinite_limits_maintains_points1  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   r3   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 )NrX   rC  )r   r   r   )r   r   r@   rA   r   r   
underlyings          r   r   zBadErrorRule.estimateW  s1    Q",RB7
""1aD11r   c                 T    t        ||      }|j                  d|j                        S )Ng    .Ar   )r   rG   r   )r   r   r@   rA   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   R  s    21r   r   ):r3   r   rp   r   scipy._lib._array_apir   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:   rB   rL   rQ   rV   r[   r`   rb   rd   rf   rl   rk   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,	*#R* R*j $($( " 
S

 S

 ) )S

l%J %JPE! E!P( (* k2KLl3LM1 1 N M1D14 1r   