
    e!h                     ,   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.                  j1                  d      gZej.                  j4                  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 Z2d  Z3d! Z4e G d" d#             Z5ej.                  jm                  d$d%g      ej.                  jm                  d&d'g      ej.                  jm                  d(g d)      e G d* d+                                  Z7e G d, d-             Z8e G d. d/             Z9e G d0 d1             Z:e ed2d3g4       G d5 d6                    Z; G d7 d8e      Z<y)9    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                 T    |j                  | d      }|j                  |d      }||z  S N)   r   )r   r   r   reshape)xnxp
x_reshaped
n_reshapeds        k/var/www/html/diagnosisapp-backend/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*   1   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/   5   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<   :   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   r3   r2   prodr4   r5   r6   r)   sin)abr7   r8   r   r:   s         r   genz_malik_1980_f_1_exactrD   K   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)   )rngr2   r   r7   r8   
difficultynormalisation_factorss          r   genz_malik_1980_f_1_random_argsrN   X   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   r1   r   r!   r&   )r2   r   r3   r@   	r   r8   betasr   r9   r:   r;   betas_reshapedr   s	            r   genz_malik_1980_f_2rS   c   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  |      }t	        |       }d|z  dz  |j                  |d      z  |j                  |j                  | |z
  |z        |j                  ||z
  |z        z
  d      z  S Nr   r   r&   )r   r   r3   r2   r   r@   atan)rB   rC   r8   rQ   r   r:   xp_tests          r   genz_malik_1980_f_2_exactrX   v   s    1:D


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


1<!c&,,/!34<t<=A a G 
d
QrwwvBw//
''LL!e)V+,w||QY<N/OO  
	
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!   rG   
   )rI   rJ   r@   r5   pow)	rK   r2   r   r:   r8   rQ   rL   productsrM   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   r1   r   r&   r2   r   r3   expr)   r   r8   r   r9   r:   r;   r   s          r   genz_malik_1980_f_3rb      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 rU   )r   r   r3   r2   r@   r`   )rB   rC   r8   r   r:   s        r   genz_malik_1980_f_3_exactrd      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&   rG   g      (@rH   )rK   r2   r   r8   rM   rL   s         r   genz_malik_1980_f_3_random_argsrf      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   r1   r   r&   )r2   r   r3   r)   ra   s          r   genz_malik_1980_f_4rh      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 rU   )r   r3   r2   r@   r5   	factorialr)   )r   r   r8   r:   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)rB   rC   r8   r   rl   r:   s     `` @r   genz_malik_1980_f_4_exactrn      s$    1:D
 %Q1b11r   c           
      `   t        |      }|j                  ||gd      }d}t        j                  t	        d      |      D ]b  }|j                  t        |t	        |            D 	cg c]  \  }}	|||	f    c}	}      }
|t        dt        |      |z          | |
      z  z  }d |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rangerI   zipr[   r)   )rl   rB   rC   r   r:   pointsoutindijselected_pointss              r   rm   rm      s     1:DXXq!f1X%F
C  q$7 =**s3d?T%Utq!fQTl%UVs2s3x$'!O*<<<= J &Vs   )B*c                     |d   }|j                  | j                  |            }|j                  |d      d   }d}||z  |z  |z  }|fS )Nr   r&   rG   g      ,@rH   )rK   r2   r   r:   r8   rM   rL   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   r1   r   r!   r&   r_   rP   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   r3   r2   r@   r5   r6   scipyspecialerf)rB   rC   r8   rQ   r   r:   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&   rG   )rI   rJ   sqrtr)   r5   )rK   r2   r   r8   rQ   rL   rM   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   r1   r   r!   r&   r_   ra   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   rt   isinfr5   r   r6   r@   )rB   rC   r8   r   r:   double_infinite_countsemi_infinite_country   s           r   f_gaussian_exactr   :  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   )rI   rJ   )rK   r2   r   r8   s       r   f_gaussian_random_argsr   P  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   Z  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      ?)r5   r6   )rB   rC   r   r   s       r   f_modified_gaussian_exactr   f  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onesr2   )r   rv   r   points       r   f_with_problematic_pointsr   n  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float64rI   r	   r*   r   estimater/   )selfr   r   r   rB   rC   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   rB   rC   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   rZ   r   r   )r   max_subdivisionsr   not_converged)rI   BadErrorRuler	   r   r   r   subdivisionsstatus)r   r   rB   rC   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   )rI   r   pytestraises	Exceptionr	   r   r   r   rB   rC   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   )rI   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   rI   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   rI   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   rI   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   r   |  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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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d*d+g,      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d/ddej<                   ej<                   gej<                  ej<                  ej<                  ej<                  gfeeed/ej<                   ej<                   ej<                   ej<                   gddej<                  ej<                  gfd0 d1 d2  e       dej<                   dgej<                  dej<                  gf ej@                  e!e"d3  e       ddej<                   ej<                   gdej<                  ej<                  ej<                  gfej
                  jF                  4      g
      d5               Z$ ed*d+g,      ej
                  j                  dd6 d7ejJ                  z  gej<                   gej<                  gdggfd8 d7ejJ                  z  ej<                   dgej<                  dgdd
ggfg      d9               Z&y):TestCubatureProblemsz9
    Tests that `cubature` gives the correct answer.
    problemr   rZ         ?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rI   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)rI   r   tupler   r   skipr	   r   r   r   errorr   )r   r   r   r   r   r   fexactrB   rC   r   r:   r   est	exact_sols        `         r   test_scalar_outputz'TestCubatureProblems.test_scalar_output  s    h  '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   r2   )	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   rJ   default_rngr   r   r   slowrI   r   r	   r   r   r   r   absr   r2   )r   r   r   r2   r   r   r   rK   r:   r   r   random_argsr   rB   rC   r   r   r   r   s                      r   test_array_outputz&TestCubatureProblems.test_array_output  s   X **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>o  s    ! r   g      I@Nc                 *    |j                  |       | z  S r  rA   r  s     r   r  zTestCubatureProblems.<lambda>~  s    "&&)A+ r   gBsvi@g        c                 B    |j                  | j                  d   df      S Nr   r   r   r2   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   )rI   r   r   r   r   r   r  r	   r   r   r   r   r  r   )r   r   r   r   r   r   r   r   rB   rC   rv   r   r:   r   r   s                  r   test_break_pointsz&TestCubatureProblems.test_break_pointsl  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*transforms make use of indexing assignmentreasons)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   )rB   rC   r   s      r   r  zTestCubatureProblems.<lambda>   s    RZZ2::Z> r   c                     t               S r  )r   rK   r2   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>4  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   rJ   r   rI   r   r   r   r   r   r  r   xslowr	   r   r   r   r   r   )r   r   r   r   r   r   rK   r   r   random_args_funcrandom_args_shaperB   rC   r   r:   r   s                   r   test_infinite_limitsz)TestCubatureProblems.test_infinite_limits  sZ   ^ **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>m  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>|  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!  )rI   r   r   r   r   r	   r   r   r   r   r   )r   r   r   r   r   r   r   r   rB   rC   rv   r:   r   r   s                 r   %test_infinite_limits_and_break_pointsz:TestCubatureProblems.test_infinite_limits_and_break_pointsf  s   J ")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<   rD   rS   rX   rb   rd   rh   rn   r   r   r   rN   r]   rf   r}   r   r  r  r   r   r   r   r5   infr   paramr   r   r#  r&  r6   r+  r.   r   r   r   r     s    [[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f!
F [[Y   & ,		
  %+	
  %+	
  %+	
  %+	
5) @ [[W 
' 
*0
AV*0X [[Y  F C D 	
" &DC	
 3E	
 3E"		
 3E "
	
[8) 8r)2s8r)2V => [[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	\&
P => [[Y - tww hhYKXXJ SE	
" 9 dgg hhYNXXqM XJ	
!) @#
A	H#
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   )rI   r   r   r   r   r   r   )r   r   r   rB   rC   
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   )rI   r
   r   r   r   r   r   r   )r   r   rB   rC   
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   )rZ   )   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   rI   r   r   r   )r   r   r;  r   r3  r   rB   rC   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)rZ   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   rI   r   r	   r   r   r   r$   )r   r@  rA  r   r   rB   rC   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).
    r:   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_weightsr2   )r   r:   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_error3  s0    ]]9,HI 	(aB'	( 	( 	(s   3<N)
r   r   r   r   r   r   r   rt   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)rB   rC   rv   r   r   r   )r?   rZ   rZ   c                   	 t        |j                  d            	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   r   c                     t        |       S r  )r   )r   rv   	xp_compats    r   r  zKTestTransformations.test_infinite_limits_maintains_points.<locals>.<lambda>S  s    /69E r   rC  r(   r   r   N)
r   emptyrI   r   r   invr   r   r   r   )
r   rB   rC   rv   r   pf_transformedr   transformed_pointrW  s
      `     @r   %test_infinite_limits_maintains_pointsz9TestTransformations.test_infinite_limits_maintains_points>  s      $BHHQK0	;ABa"**Qbjj*1B0EJJq	 1 1J2JJq	 1 1J2
  	1E - 1 1)2C2CE72S Ty0QR 1/01 1	1 C1 1s   $C&	C++C4	N)	r   r   r   r   r   r   r5   r,  r]  r.   r   r   rT  rT  8  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 )NrZ   rC  )r   r   r   )r   r   rB   rC   r   r   
underlyings          r   r   zBadErrorRule.estimatee  s1    Q",RB7
""1aD11r   c                 T    t        ||      }|j                  d|j                        S )Ng    .Ar   )r   rI   r   )r   r   rB   rC   r   r   s         r   estimate_errorzBadErrorRule.estimate_errork  s%    Q"zz#RZZz00r   N)r.   )r   r   r   r   r   rb  r.   r   r   r   r   `  s    21r   r   )=r5   r   rr   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/   r<   rD   rN   rS   rX   r]   rb   rd   rf   rh   rn   rm   r}   r   r   r   r   r   r   r   r   r   r   r   r   r/  r:  rJ  rT  r   r.   r   r   <module>rj     s        0 $  ?kk%%&89;
;;// "/
K0
O"
S&""A"J"2"0"
G,	*# R* R* R*j $($( " 
 S

 S

  ) )S

l %J %J %JP E! E! E!P ( ( (* 9: 1  1	 
 1F14 1r   