
    doi              	           S r SSKJr  SSKJr  S rS rS rS rS	 r	S
 r
S rS rS rS r\\\	\
\\\\S.rS rS rS rS rS rg)aj  
'Generic' Array API backend for RBF interpolation.

The general logic is this: `_rbfinterp.py` implements the user API and calls
into either `_rbfinterp_np` (the "numpy backend"), or `_rbfinterp_xp` (the
"generic backend".

The numpy backend offloads performance-critical computations to the
pythran-compiled `_rbfinterp_pythran` extension. This way, the call chain is

    _rbfinterp.py <-- _rbfinterp_np.py <-- _rbfinterp_pythran.py

The "generic" backend here is a drop-in replacement of the API of
`_rbfinterp_np.py` for use in `_rbfinterp.py` with non-numpy arrays.

The implementation closely follows `_rbfinterp_np + _rbfinterp_pythran`, with
the following differences:

  -  We used vectorized code not explicit loops in `_build_system` and
     `_build_evaluation_coefficients`; this is more torch/jax friendly;
  - RBF kernels are also "vectorized" and not scalar: they receive an
    array of norms not a single norm;
  - RBF kernels accept an extra xp= argument;

In general, we would prefer less code duplication. The main blocker ATM is
that pythran cannot compile functions with an xp= argument where xp is numpy.
    )LinAlgError   )_monomial_powers_implc                     [        X5      nUR                  U5      nUR                  S   S:X  a  UR                  USU 45      nU$ )Nr   )r   asarrayshapereshape)ndimdegreexpouts       [/var/www/html/land-ocr/venv/lib/python3.13/site-packages/scipy/interpolate/_rbfinterp_xp.py_monomial_powersr       sB    

-C
**S/C
yy|qjjq$i(J    c           	      4   [        XX#XEU5      u  pxp UR                  R                  Xx5      nXU4$ ! [         a[    SnUR                  S   nUS:  a8  [        X	-
  U
-  XVS9nUR                  R                  U5      nX:  a	  SU SU S3n[        U5      ef = f)a  Build and solve the RBF interpolation system of equations.

Parameters
----------
y : (P, N) float ndarray
    Data point coordinates.
d : (P, S) float ndarray
    Data values at `y`.
smoothing : (P,) float ndarray
    Smoothing parameter for each data point.
kernel : str
    Name of the RBF.
epsilon : float
    Shape parameter.
powers : (R, N) int ndarray
    The exponents for each monomial in the polynomial.

Returns
-------
coeffs : (P + R, S) float ndarray
    Coefficients for each RBF and monomial.
shift : (N,) float ndarray
    Domain shift used to create the polynomial matrix.
scale : (N,) float ndarray
    Domain scaling used to create the polynomial matrix.

zSingular matrixr   )r   zqSingular matrix. The matrix of monomials evaluated at the data point coordinates does not have full column rank (/z).)_build_systemlinalgsolve	Exceptionr   polynomial_matrixmatrix_rankr   )yd	smoothingkernelepsilonpowersr   lhsrhsshiftscalecoeffsmsgnmonospmatranks                   r   _build_and_solve_systemr(   (   s    8 +	i"
Ce*& %  
  aA:$ai%6FD99((.D}!F!F82/ 
 #!s
   2 A%Bc                     U * $ N rr   s     r   linearr.   ^   s	    2Ir   c                 X    UR                  U S:H  SU S-  UR                  U 5      -  5      $ )Nr      )wherelogr,   s     r   thin_plate_spliner3   b   s*    88AFAq!tbffQi/00r   c                     U S-  $ )N   r+   r,   s     r   cubicr6   g   s    a4Kr   c                     U S-  * $ )N   r+   r,   s     r   quinticr9   k   s    qD5Lr   c                 2    UR                  U S-  S-   5      * $ )Nr0   r   sqrtr,   s     r   multiquadricr=   o   s    GGAqD1Hr   c                 6    SUR                  U S-  S-   5      -  $ N      ?r0   r;   r,   s     r   inverse_multiquadricrA   s   s    A$$$r   c                     SU S-  S-   -  $ r?   r+   r,   s     r   inverse_quadraticrC   w   s    !Q$*r   c                 ,    UR                  U S-  * 5      $ )Nr0   )expr,   s     r   gaussianrF   {   s    661a4%=r   )r.   r3   r6   r9   r=   rA   rC   rF   c           
      r    U" UR                   R                  U SSS2SS24   U SS2SSS24   -
  SS9U5      $ )z+Evaluate RBFs, with centers at `x`, at `x`.Naxis)r   vector_norm)xkernel_funcr   s      r   kernel_matrixrN      sA    
		aa
ma4
m;"Er r   c                 <    UR                  U SS2SSS24   U-  SS9$ )z9Evaluate monomials, with exponents from `powers`, at `x`.NrH   rI   )prod)rL   r   r   s      r   r   r      s$    771QaZ=F*744r   c           
      d   UR                   S   nUR                   S   n[        U   n	UR                  U SS9n
UR                  U SS9nX-   S-  nX-
  S-  nUR	                  US:H  SU5      nX-  nX-
  U-  n[        XU5      n[        XU5      nUR                  UR                  UU4SS9UR                  UR                  UR                  X45      4SS9/SS9UR                  UR                  X&R                  U5      /5      5      -   nUR                  XR                  X45      /SS9nUUX4$ )a  Build the system used to solve for the RBF interpolant coefficients.

Parameters
----------
y : (P, N) float ndarray
    Data point coordinates.
d : (P, S) float ndarray
    Data values at `y`.
smoothing : (P,) float ndarray
    Smoothing parameter for each data point.
kernel : str
    Name of the RBF.
epsilon : float
    Shape parameter.
powers : (R, N) int ndarray
    The exponents for each monomial in the polynomial.

Returns
-------
lhs : (P + R, P + R) float ndarray
    Left-hand side matrix.
rhs : (P + R, S) float ndarray
    Right-hand side matrix.
shift : (N,) float ndarray
    Domain shift used to create the polynomial matrix.
scale : (N,) float ndarray
    Domain scaling used to create the polynomial matrix.

r   r   rI   r0   g        r@   )r   NAME_TO_FUNCminmaxr1   rN   r   concatTzerosdiag)r   r   r   r   r   r   r   sr-   rM   minsmaxsr!   r"   yepsyhatout_kernelsout_polyr   r    s                       r   r   r      sS   < 	

AQAv&K 66!!6D66!!6D[!OE[!OE HHUc\3.E9DIuD B7K r2H
))	K*	3	HJJ! 01	:	
   
 		9hhqk":;<=C ))Q!())
2CU!!r   c                     [         U   nX-  n	X-  n
X-
  U-  nUR                  U" UR                  R                  U
SS2SSS24   U	SSS2SS24   -
  SS9U5      UR	                  USS2SSS24   U-  SS9/SS9nU$ )a-  Construct the coefficients needed to evaluate
the RBF.

Parameters
----------
x : (Q, N) float ndarray
    Evaluation point coordinates.
y : (P, N) float ndarray
    Data point coordinates.
kernel : str
    Name of the RBF.
epsilon : float
    Shape parameter.
powers : (R, N) int ndarray
    The exponents for each monomial in the polynomial.
shift : (N,) float ndarray
    Shifts the polynomial domain for numerical stability.
scale : (N,) float ndarray
    Scales the polynomial domain for numerical stability.

Returns
-------
(Q, P + R) float ndarray

NrH   rI   )rR   rU   r   rK   rP   )rL   r   r   r   r   r!   r"   r   rM   r\   xepsxhatvecs                r   _build_evaluation_coefficientsrd      s    8 v&K9D9DIuD ))		%%D!$tD!QJ'77b & 
 GGDD!$.RG8	
   	C Jr   c	           
      &    [        XX#XEXh5      n	X-  $ r*   )rd   )
rL   r   r   r   r   r!   r"   r#   r   rc   s
             r   compute_interpolationrf     s    
(	fveC <r   N)__doc__numpy.linalgr   _rbfinterp_commonr   r   r(   r.   r3   r6   r9   r=   rA   rC   rF   rR   rN   r   r   rd   rf   r+   r   r   <module>rj      s   6 % 43 l1
%
 )/)	5
;"|.br   