Ë
    Ñ[;j­G  ã                   ó
  — d dl Z d dlZd dlZd dlZd dlmZ d dlmZ ddl	m
Z
 d dlmc mZ d dlmZ d dlmZmZ ddlmZmZ d	gZd
„ Z edddg¬«       G d„ d	«      «       Zd„ Zej6                  fd„Zdej6                  dœd„Zy)é    N)Úprod)ÚGenericAliasé   )Ú_dierckx)Ú	csr_array)Úarray_namespaceÚxp_capabilities)Ú_not_a_knotÚBSplineÚ	NdBSplinec                 óŠ   — t        j                  | t         j                  «      rt         j                  S t         j                  S )z>Return np.complex128 for complex dtypes, np.float64 otherwise.)ÚnpÚ
issubdtypeÚcomplexfloatingÚ
complex128Úfloat64©Údtypes    úeG:\00. PROJECTS\API\Inventory\templateJSON\kerjaOCR\Lib\site-packages\scipy/interpolate/_ndbspline.pyÚ
_get_dtyper      s*   € ä	‡}�}�UœB×.Ñ.Ô/Ü�}‰}Ðä�z‰zÐó    TF)z
dask.arrayz7https://github.com/data-apis/array-api-extra/issues/488)Úcpu_onlyÚjax_jitÚskip_backendsc                   óŠ   — e Zd ZdZ ee«      Zddœd„Zed„ «       Z	ed„ «       Z
ed„ «       Zdddœd	„Zedd
„«       Zdd„Zd„ Zy)r   a¸  Tensor product spline object.

    The value at point ``xp = (x1, x2, ..., xN)`` is evaluated as a linear
    combination of products of one-dimensional b-splines in each of the ``N``
    dimensions::

       c[i1, i2, ..., iN] * B(x1; i1, t1) * B(x2; i2, t2) * ... * B(xN; iN, tN)


    Here ``B(x; i, t)`` is the ``i``-th b-spline defined by the knot vector
    ``t`` evaluated at ``x``.

    Parameters
    ----------
    t : tuple of 1D ndarrays
        knot vectors in directions 1, 2, ... N,
        ``len(t[i]) == n[i] + k + 1``
    c : ndarray, shape (n1, n2, ..., nN, ...)
        b-spline coefficients
    k : int or length-d tuple of integers
        spline degrees.
        A single integer is interpreted as having this degree for
        all dimensions.
    extrapolate : bool, optional
        Whether to extrapolate out-of-bounds inputs, or return `nan`.
        Default is to extrapolate.

    Attributes
    ----------
    t : tuple of ndarrays
        Knots vectors.
    c : ndarray
        Coefficients of the tensor-product spline.
    k : tuple of integers
        Degrees for each dimension.
    extrapolate : bool, optional
        Whether to extrapolate or return nans for out-of-bounds inputs.
        Defaults to true.

    Methods
    -------
    __call__
    derivative
    design_matrix

    See Also
    --------
    BSpline : a one-dimensional B-spline object
    NdPPoly : an N-dimensional piecewise tensor product polynomial

    N©Úextrapolatec                ó$  — t        ||«      \  | _        | _        \  | _        | _        t        |g|¢­Ž j                  | _        |€d}t        |«      | _	        t        j                  |«      | _        | j                  j                  d   }| j                  j                  |k  rt        d|› d�«      ‚t        |«      D ]Œ  }| j                   |   }| j"                  |   }|j                  d   |z
  dz
  }	| j                  j                  |   |	k7  sŒSt        d|› d| j                  j                  |   › dt%        |«      › d	|	› d
|› d�«      ‚ t'        | j                  j(                  «      }
t        j*                  | j                  |
¬«      | _        y )NTr   zCoefficients must be at least z-dimensional.r   z,Knots, coefficients and degree in dimension z are inconsistent: got z coefficients for z knots, need at least z for k=Ú.r   )Ú_preprocess_inputsÚ_kÚ_indices_k1dÚ_tÚ_len_tr   ÚasarrayÚ_asarrayÚboolr   r   Ú_cÚshapeÚndimÚ
ValueErrorÚrangeÚtÚkÚlenr   r   Úascontiguousarray)Úselfr-   Úcr.   r   r*   ÚdÚtdÚkdÚnÚdts              r   Ú__init__zNdBSpline.__init__[   sp  € Ü=OÐPQÐSTÓ=UÑ:ˆŒ�Ô"Ñ$: T¤W¨d¬kä'¨Ð.¨AÒ.×6Ñ6ˆŒàÐØˆKÜ Ó,ˆÔä—*‘*˜Q“-ˆŒà�w‰w�}‰}˜QÑˆØ�7‰7�<‰<˜$ÒÜÐ=¸d¸VÀ=ÐQÓRÐRä�t–ˆAØ—‘˜‘ˆBØ—‘˜‘ˆBØ—‘˜‘˜bÑ  1Ñ$ˆAà�w‰w�}‰}˜QÑ 1Ó$Ü ð $%Ø%& Cð ()Ø)-¯©¯©°qÑ)9Ð(:ð ;%Ü%(¨£W IÐ-CÀAÀ3ð G'Ø'( c¨ð	",ó -ð -ð ô ˜Ÿ™Ÿ™Ó&ˆÜ×&Ñ& t§w¡w°bÔ9ˆ�r   c                 ó,   — t        | j                  «      S ©N)Útupler!   ©r1   s    r   r.   zNdBSpline.ky   s   € ä�T—W‘W‹~Ðr   c                 ól   ‡ — t        ˆ fd„t        ‰ j                  j                  d   «      D «       «      S )Nc              3   ó|   •K  — | ]3  }‰j                  ‰j                  |d ‰j                  |   …f   «      –— Œ5 y ­wr:   )r&   r#   r$   )Ú.0r3   r1   s     €r   Ú	<genexpr>zNdBSpline.t.<locals>.<genexpr>€   s9   øè ø€ ð 
Ù@W¸1ˆD�M‰M˜$Ÿ'™' ! _ d§k¡k°!¡n _Ð"4Ñ5×6Ñ@Wùs   ƒ9<r   )r;   r,   r#   r)   r<   s   `r   r-   zNdBSpline.t}   s2   ø€ ô ó 
Ü@EÀdÇgÁgÇmÁmÐTUÑFVÔ@Wó
ó 
ð 	
r   c                 ó8   — | j                  | j                  «      S r:   )r&   r(   r<   s    r   r2   zNdBSpline.c„   s   € à�}‰}˜TŸW™WÓ%Ð%r   )Únur   c                óü  — | j                   j                  d   }|€| j                  }t        |«      }|€'t	        j
                  |ft        j                  ¬«      }n‡t	        j                  |t        j                  ¬«      }|j                  dk7  s|j                  d   |k7  r%t        d|›dt        | j                  «      › d�«      ‚t        |dk  «      rt        d|›�«      ‚t	        j                  |t        ¬«      }|j                  }|j                  d	|d	   «      }t	        j                  |«      }|d	   |k7  rt        d
|› d|› �«      ‚| j                   j"                  j$                  dk(  }| j                   }|r(| j                   j                  |k(  r| j                   d   }|j'                  t        «      }|j                  |j                  d| dz   «      }|j)                  «       }	t	        j                  |j*                  D �
cg c]  }
|
|j"                  j,                  z  ‘Œ c}
t        j                  ¬«      }|j                  d	   }t/        j0                  || j                   | j2                  | j4                  |||	||| j6                  «
      }|j'                  | j                   j"                  «      }|j                  |dd	 | j                   j                  |d z   «      }| j9                  |«      S c c}
w )aB  Evaluate the tensor product b-spline at ``xi``.

        Parameters
        ----------
        xi : array_like, shape(..., ndim)
            The coordinates to evaluate the interpolator at.
            This can be a list or tuple of ndim-dimensional points
            or an array with the shape (num_points, ndim).
        nu : sequence of length ``ndim``, optional
            Orders of derivatives to evaluate. Each must be non-negative.
            Defaults to the zeroth derivivative.
        extrapolate : bool, optional
            Whether to exrapolate based on first and last intervals in each
            dimension, or return `nan`. Default is to ``self.extrapolate``.

        Returns
        -------
        values : ndarray, shape ``xi.shape[:-1] + self.c.shape[ndim:]``
            Interpolated values at ``xi``
        r   Nr   r   ú)invalid number of derivative orders nu = ú for ndim = r   z'derivatives must be positive, got nu = éÿÿÿÿzShapes: xi.shape=z
 and ndim=r2   ).N)rF   )r#   r)   r   r'   r   ÚzerosÚint64r%   r*   r+   r/   r-   ÚanyÚfloatÚreshaper0   r(   r   ÚkindÚviewÚravelÚstridesÚitemsizer   Úevaluate_ndbspliner$   r!   r"   r&   )r1   ÚxirB   r   r*   Úxi_shapeÚwas_complexÚccÚc1Úc1rÚsÚ_strides_c1Únum_c_trÚouts                 r   Ú__call__zNdBSpline.__call__ˆ   s�  € ð* �w‰w�}‰}˜QÑˆàÐØ×*Ñ*ˆKÜ˜;Ó'ˆàˆ:Ü—‘˜4˜'¬¯©Ô2‰Bä—‘˜B¤b§h¡hÔ/ˆBØ�w‰w˜!Š|˜rŸx™x¨™{¨dÒ2Ü Ø@¸2¸'ð BÜ! $§&¡&›k˜]¨!ð-ó.ð .ô �2˜‘6Œ{Ü Ð#KÀbÀWÐ!MÓNÐNô �Z‰Z˜¤%Ô(ˆØ—8‘8ˆØ�Z‰Z˜˜H R™LÓ)ˆÜ×!Ñ! "Ó%ˆà�B‰<˜4ÒÜÐ0°°
¸*ÀTÀFÐKÓLÐLð —g‘g—m‘m×(Ñ(¨CÑ/ˆØ�W‰WˆÙ˜4Ÿ7™7Ÿ<™<¨4Ò/ð —‘˜Ñ#ˆBØ�W‰W”U‹^ˆð �Z‰Z˜Ÿ™  $˜¨%Ñ/Ó0ˆØ�h‰h‹jˆô —j‘jØ+-¯:ª:ó"7Ù+5 að #$ r§x¡x×'8Ñ'8Ó"8Ø+5ñ"7Ü>@¿h¹hôHˆð —8‘8˜B‘<ˆÜ×)Ñ)¨"Ø!%§¡Ø!%§¡Ø!%§¡Ø!#Ø!,Ø!$Ø!)Ø!,Ø!%×!2Ñ!2ó

ˆð �h‰h�t—w‘w—}‘}Ó%ˆØ�k‰k˜( 3 B˜-¨$¯'©'¯-©-¸¸Ð*>Ñ>Ó?ˆØ�}‰}˜SÓ!Ð!ùò#"7s   È	 K9c                 óô  ‡‡— t        j                  |t        ¬«      }|j                  d   }t	        |«      |k7  rt        dt	        |«      › d|›d�«      ‚t        ‰|«      \  Š}\  }Št        ˆˆfd„t        |«      D «       «      }|dd d	z   }	t        j                  |	ddd…   t         j                  ¬«      ddd…   j                  «       }
t        j                  ||‰‰||
«      \  }}}t        |||f«      S )
a  Construct the design matrix as a CSR format sparse array.

        Parameters
        ----------
        xvals :  ndarray, shape(npts, ndim)
            Data points. ``xvals[j, :]`` gives the ``j``-th data point as an
            ``ndim``-dimensional array.
        t : tuple of 1D ndarrays, length-ndim
            Knot vectors in directions 1, 2, ... ndim,
        k : int
            B-spline degree.
        extrapolate : bool, optional
            Whether to extrapolate out-of-bounds values of raise a `ValueError`

        Returns
        -------
        design_matrix : a CSR array
            Each row of the design matrix corresponds to a value in `xvals` and
            contains values of b-spline basis elements which are non-zero
            at this value.

        r   rF   z*Data and knots are inconsistent: len(t) = z for  ndim = r   c              3   ó:   •K  — | ]  }‰|   ‰|   z
  d z
  –— Œ y­w©r   N© )r?   r3   r.   Úlen_ts     €€r   r@   z*NdBSpline.design_matrix.<locals>.<genexpr>þ   s#   øè ø€ ÐA±[°˜˜a™ 1 Q¡4™¨!Õ+±[ùs   ƒr   N©r   )r   r%   rJ   r)   r/   r+   r    r;   r,   ÚcumprodrH   Úcopyr   Ú	_coloc_ndr   )ÚclsÚxvalsr-   r.   r   r*   r"   r#   Úc_shapeÚcsÚcstridesÚdataÚindicesÚindptrra   s      `          @r   Údesign_matrixzNdBSpline.design_matrixØ   s   ù€ ô0 —
‘
˜5¬Ô.ˆØ�{‰{˜2‰ˆÜˆq‹6�TŠ>ÜØ<¼SÀ»V¸Hð EØ�9˜Aðóð ô (:¸!¸QÓ'?Ñ$ˆˆ<™˜"˜eô
 ÔA´U¸4´[ÓAÓAˆð �Q�Rˆ[˜4ÑˆÜ—:‘:˜b¡ 2 ™h¬b¯h©hÔ7¹¸"¸Ñ=×BÑBÓDˆô !)× 2Ñ 2°5Ø�E˜1˜l¨Hó!6Ñˆˆg�vô ˜$ ¨Ð0Ó1Ð1r   c           	      ó
  — t        j                  ||d«      }|j                  d   }|j                  dd  }|j                  |d«      }g }	d }
t	        |j                  d   «      D ]Í  }||k\  rgt        j                  ||d d …|f   |«      }|j                  |«      }|j                  d t        |j                  «      |j                  z
  dz
   |_        n6t        j                  |t        j                  t        |«      dz
  «      d«      }|
€|j                  }
|	j                  |j                  «       ŒÏ t        j                  |	d¬«      j                  t        |	d   «      f|z   «      }t        j                  |d|«      }||
fS )Nr   r   rF   )Úaxis)r   Úmoveaxisr)   rK   r,   r   Úconstruct_fastÚ
derivativer2   r/   r-   r.   rG   ÚappendÚstack)r1   r2   r-   r.   rp   rB   r6   Útrailing_shapeÚc_flatÚ
new_c_listÚnew_tÚiÚbÚdbÚnew_cs                  r   Ú_bspline_derivative_along_axisz(NdBSpline._bspline_derivative_along_axis  sM  € ä�K‰K˜˜4 Ó#ˆØ�G‰G�A‰JˆØŸ™  ˜ˆØ—‘˜1˜bÓ!ˆàˆ
Øˆä�v—|‘| A‘Ö'ˆAØ�BŠwÜ×*Ñ*¨1¨f²Q¸°T©l¸AÓ>�Ø—\‘\ "Ó%�à—t‘tÐ1œS §¡›Y¨¯©Ñ-°Ñ1Ð2�•ä×+Ñ+¨A¬r¯x©x¼¸A»À¹
Ó/CÀQÓG�àˆ}ØŸ™�à×Ñ˜bŸd™dÕ#ð (ô —‘˜¨!Ô,×4Ñ4Ü�˜A‘ÓÐ! NÑ2ó4ˆä—‘˜E 1 dÓ+ˆà�eˆ|Ðr   c                 ód  ‡ — t        j                  |t         j                  ¬«      }t        ‰ j                  «      }|j
                  dk7  s|j                  d   |k7  r%t        d|›dt        ‰ j                  «      › d�«      ‚t        |dk  «      rt        d|›�«      ‚t        ‰ j                  j                  d   «      D �cg c]"  }‰ j                  |d‰ j                  |   …f   ‘Œ$ }}t        ‰ j                  «      }‰ j                  j                  «       }t!        |«      D ]B  \  }}	|	dk(  rŒ‰ j#                  |||   ||   ||	¬	«      \  }||<   t%        ||   |	z
  d«      ||<   ŒD t'        t)        ˆ fd
„|D «       «      ‰ j+                  |«      t)        |«      ‰ j,                  ¬«      S c c}w )a{  
        Construct a new NdBSpline representing the partial derivative.

        Parameters
        ----------
        nu : array_like of shape (ndim,)
            Orders of the partial derivatives to compute along each dimension.

        Returns
        -------
        NdBSpline
            A new NdBSpline representing the partial derivative of the original spline.

        r   r   r   rD   rE   r   z-derivative orders must be positive, got nu = N)rB   c              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr:   )r&   )r?   r-   r1   s     €r   r@   z'NdBSpline.derivative.<locals>.<genexpr>Q  s   øè ø€ Ð?¹°A˜tŸ}™}¨Q×/¹ùs   ƒr   )r   r%   rH   r/   r-   r*   r)   r+   rI   r,   r#   r$   Úlistr.   r(   rd   Ú	enumerater~   Úmaxr   r;   r&   r   )
r1   rB   Únu_arrr*   r3   Út_newÚk_newÚc_newrp   r6   s
   `         r   rs   zNdBSpline.derivative)  s•  ø€ ô —‘˜B¤b§h¡hÔ/ˆÜ�4—6‘6‹{ˆà�;‰;˜!Ò˜vŸ|™|¨A™°$Ò6ÜØ<°r°gð >Ü˜dŸf™f›+˜ að)ó*ð *ô ˆv˜‰zŒ?ÜÐMÈÀwÐOÓPÐPô 7<¸D¿G¹G¿M¹MÈ!Ñ<LÔ6MÓNÑ6M°�—‘˜˜O˜TŸ[™[¨™^˜OÐ+Ó,Ð6MˆÐNÜ�T—V‘V“ˆØ—‘—‘“ˆä  Ö(‰GˆD�!Ø�AŠvØà!%×!DÑ!DØ�u˜T‘{ E¨$¡K°¸!ð "Eó "ÑˆE�5˜‘;ô ˜e D™k¨A™o¨qÓ1ˆE�$ŠKð )ô œÓ?¹Ó?Ó?ØŸ™ uÓ-Ü˜u›Ø%)×%5Ñ%5ô
ð 	
ùò Os   Ã'F-)Trb   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úclassmethodr   Ú__class_getitem__r8   Úpropertyr.   r-   r2   r\   rn   r~   rs   r`   r   r   r   r      s†   „ ñ2ñj $ LÓ1Ðà/3ô :ð< ñó ðð ñ
ó ð
ð ñ&ó ð&ð "&°4ô N"ð` ò02ó ð02ódó<,
r   c           
      óè  — t        |t        «      st        d|› d�«      ‚t        |«      }	 t        | «       t        j                  | D �cg c]  }t        j                  |«      ‘Œ c}t
        j                  ¬«      } t        | «      |k7  r$t        dt        |«      › dt        | «      ›d�«      ‚t        |«      }t        |«      D �]'  }t        j                  ||   «      }| |   }|j                  d   |z
  dz
  }|dk  rt        d	|› d
�«      ‚|j                  dk7  rt        d|› d�«      ‚||dz   k  rt        dd|z  dz   › d|› d|› d�«      ‚t        j                  |«      dk  j                  «       rt        d|› d�«      ‚t        t        j                  |||dz    «      «      dk  rt        d|› d�«      ‚t        j                   |«      j#                  «       r�Œt        d|› d�«      ‚ t        d„ | D «       «      }t        j$                  t        j&                  t)        |«      «      |«      }	t        j                  |	t
        j                  ¬«      j*                  j-                  «       }
|D �cg c]  }t        j                  |«      ‘Œ }}t        |«      }|D �cg c]  }t        |«      ‘Œ }}t        j.                  |t1        |«      ft2        ¬«      }|j5                  t
        j6                  «       t        |«      D ]  }||   ||dt        ||   «      …f<   Œ t        j                  |t
        j                  ¬«      }| |
||ffS # t        $ r
 | f|z  } Y �Œ*w xY wc c}w c c}w c c}w )zÁHelpers: validate and preprocess NdBSpline inputs.

       Parameters
       ----------
       k : int or tuple
          Spline orders
       t_tpl : tuple or array-likes
          Knots.
    z-Expect `t` to be a tuple of array-likes. Got z	 instead.r   z	len(t) = z != len(k) = r   r   r   zSpline degree in dimension z cannot be negative.zKnot vector in dimension z must be one-dimensional.zNeed at least é   z knots for degree z in dimension zKnots in dimension z# must be in a non-decreasing order.z.Need at least two internal knots in dimension z should not have nans or infs.c              3   ó&   K  — | ]	  }|d z   –— Œ y­wr_   r`   )r?   r5   s     r   r@   z%_preprocess_inputs.<locals>.<genexpr>�  s   è ø€ Ð%¡1˜R�"�q•&¡1ùs   ‚N)Ú
isinstancer;   r+   r/   Ú	TypeErrorr   r%   ÚoperatorÚindexrH   r,   r)   r*   ÚdiffrI   ÚuniqueÚisfiniteÚallÚunravel_indexÚaranger   ÚTrd   Úemptyrƒ   rJ   ÚfillÚnan)r.   Út_tplr*   Úkir3   r4   r5   r6   r)   rl   r"   r-   Útira   r#   s                  r   r    r    W  sQ  € ô �eœUÔ#Üð  Ø %˜w ið1ó 
ð 	
ô
 ˆu‹:€DðÜˆAŒô
 	�
‰
±Ó3±¨2”H—N‘N 2Õ&°Ñ3¼2¿8¹8ÔD€Aä
ˆ1ƒv�‚~Ü˜9¤S¨£Z L°´S¸³V°K¸qÐAÓBÐBô ˆu‹:€DÜ�4�[ˆÜ�Z‰Z˜˜a™Ó!ˆØˆq‰TˆØ�H‰H�Q‰K˜"Ñ˜qÑ ˆØ�Š6ÜÐ:¸1¸#ð >*ð +ó ,ð ,à�7‰7�aŠ<ÜÐ8¸¸ð <1ð 2ó 3ð 3àˆr�A‰vŠ:Ü˜~¨a°©d°Q©h¨Zð 8!Ø!#  N°1°#°Qð8ó 9ð 9ä�G‰G�B‹K˜!‰O× Ñ Ô"ÜÐ2°1°#ð 66ð 7ó 8ð 8äŒr�y‰y˜˜B˜q 1™u˜Ó&Ó'¨!Ò+Üð  +Ø+,¨#¨Qð0ó 1ð 1ä�{‰{˜2‹×"Ñ"Ö$ÜÐ2°1°#ð 6.ð /ó 0ð 0ð) ô2 Ñ%¡1Ó%Ó%€EÜ×ÑœrŸy™y¬¨e«Ó5°uÓ=€GÜ—:‘:˜g¬R¯X©XÔ6×8Ñ8×=Ñ=Ó?€Lñ %*Ó*¡E˜qŒR�Z‰Z˜�] E€EÐ*Üˆu‹:€DÙ$Ó%™u˜ŒS��W˜u€EÐ%Ü	�‰�4œ˜U›Ð$¬EÔ	2€BØ‡G�GŒB�F‰F„OÜ�4Ž[ˆØ % a¡ˆˆ1ˆnŒs�5˜‘8‹}ˆnÐÒð ä�J‰J�u¤B§H¡HÔ-€Eàˆl˜R ˜KÐ'Ð'øôm ò àˆD�‰I‹ðüò 4ùòR +ùâ%s#   ¬M Á
M%É5M*Ê"M/ÍM"Í!M"c           
      ó.  — t        j                  |j                  t         j                  «      r8t	        | |j
                  |fi |¤Ž}t	        | |j                  |fi |¤Ž}|d|z  z   S |j                  dk(  r{|j                  d   dk7  rit        j                  |«      }t        |j                  d   «      D ]7  } || |d d …|f   fi |¤Ž\  |d d …|f<   }|dk7  sŒ$t        d|›d|›d|› d�«      ‚ |S  || |fi |¤Ž\  }}|dk7  rt        d|›d	|›d�«      ‚|S )
Ny              ð?r�   r   r   z	solver = z returns info =z for column r   z returns info = )r   r   r   r   Ú_iter_solveÚrealÚimagr*   r)   Ú
empty_liker,   r+   )	Úar{   ÚsolverÚsolver_argsr¥   r¦   ÚresÚjÚinfos	            r   r¤   r¤   ¤  s&  € ô
 
‡}�}�Q—W‘Wœb×0Ñ0Ô1Ü˜1˜aŸf™f fÑ<°Ñ<ˆÜ˜1˜aŸf™f fÑ<°Ñ<ˆØ�b˜‘g‰~Ðà‡v�v�‚{�q—w‘w˜q‘z A’~Ü�m‰m˜AÓˆÜ�q—w‘w˜q‘zÖ"ˆAÙ$ Q¨ª!¨Q¨$©Ñ?°;Ñ?‰OˆC’�1�‰I�tØ�q‹yÜ  I F ;Ð.>¸°x¸|ÈAÈ3ÈaÐ!PÓQÐQð #ð ˆ
á˜1˜aÑ/ ;Ñ/‰	ˆˆTØ�1Š9Ü 	 ˜{Ð*;°D°9¸AÐ>Ó?Ð?Øˆ
r   ©r©   c                óŠ  ‡ ‡— t        ‰ «      }t        d„ ‰ D «       «      }	 t        ‰«       t        ‰ «      D ]L  \  }}t        t	        j
                  |«      «      }	|	‰|   k  sŒ-t        d|	› d|› d‰|   › d‰|   dz   › d�	«      ‚ t        ˆˆ fd„t        |«      D «       «      }
t	        j                  t        j                  ‰ Ž D �cg c]  }|‘Œ c}t        ¬	«      }t        j                  ||
‰«      }‰d
   dk\  r|j                  «        |j                  }t!        |d| «      t!        ||d «      f}|j#                  |«      }|t$        j&                  k7  r$t)        j*                  t,        |¬«      }d|vrd|d<    |||fi |¤Ž}|j#                  |||d z   «      }t        |
|‰«      S # t        $ r
 ‰f|z  ŠY �Œ�w xY wc c}w )a“  Construct an interpolating NdBspline.

    Parameters
    ----------
    points : tuple of ndarrays of float, with shapes (m1,), ... (mN,)
        The points defining the regular grid in N dimensions. The points in
        each dimension (i.e. every element of the `points` tuple) must be
        strictly ascending or descending.
    values : ndarray of float, shape (m1, ..., mN, ...)
        The data on the regular grid in n dimensions.
    k : int, optional
        The spline degree. Must be odd. Default is cubic, k=3
    solver : a `scipy.sparse.linalg` solver (iterative or direct), optional.
        An iterative solver from `scipy.sparse.linalg` or a direct one,
        `sparse.sparse.linalg.spsolve`.
        Used to solve the sparse linear system
        ``design_matrix @ coefficients = rhs`` for the coefficients.
        Default is `scipy.sparse.linalg.gcrotmk`
    solver_args : dict, optional
        Additional arguments for the solver. The call signature is
        ``solver(csr_array, rhs_vector, **solver_args)``

    Returns
    -------
    spl : NdBSpline object

    Notes
    -----
    Boundary conditions are not-a-knot in all dimensions.
    c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr:   )r/   )r?   Úxs     r   r@   zmake_ndbspl.<locals>.<genexpr>Ü  s   è ø€ Ð,¡V ”S˜—V¡Vùs   ‚z
There are z points in dimension z, but order z requires at least  r   z points per dimension.c              3   ót   •K  — | ]/  }t        t        j                  ‰|   t        ¬ «      ‰|   «      –— Œ1 y­w)r   N)r
   r   r%   rJ   )r?   r3   r.   Úpointss     €€r   r@   zmake_ndbspl.<locals>.<genexpr>ë  s3   øè ø€ ð $Ù"�!ô œ"Ÿ*™* V¨A¡Y´eÔ<¸aÀ¹d×CÙ"ùs   ƒ58r   r   é   Nr®   Úatolg�íµ ÷Æ°>)r/   r;   r“   r‚   r   Ú
atleast_1dr+   r,   r%   Ú	itertoolsÚproductrJ   r   rn   Úeliminate_zerosr)   r   rK   ÚsslÚspsolveÚ	functoolsÚpartialr¤   )r³   Úvaluesr.   r©   rª   r*   rS   r3   ÚpointÚnumptsr-   Úxvrg   ÚmatrÚv_shapeÚ
vals_shapeÚvalsÚcoefs   ` `               r   Úmake_ndbsplrÇ   ¼  sß  ù€ ô> ˆv‹;€DÜÑ,¡VÓ,Ó,€HðÜˆAŒô
 ˜fÖ%‰ˆˆ5Ü”R—]‘] 5Ó)Ó*ˆØ�Q�q‘T‹>Ü˜z¨&¨Ð1FÀqÀcð J+Ø+,¨Q©4¨&ð 1!Ø!" 1¡ a¡ Ð(>ð@ó Að Að &ô 	ô $Ü˜T”{ó$ó 	$€Aä�J‰J¤Y×%6Ñ%6¸Ñ%?Ó@Ñ%?˜ršÐ%?Ñ@ÌÔN€Eô ×"Ñ" 5¨!¨QÓ/€Dð 	ˆ�tˆq‚yØ×ÑÔð
 �l‰l€GÜ�w˜u �~Ó&¬¨W°T°U¨^Ó(<Ð=€JØ�>‰>˜*Ó%€Dà”—‘ÒÜ×"Ñ"¤;°vÔ>ˆØ˜Ñ$à"&ˆK˜Ñá�$˜Ñ, Ñ,€DØ�<‰<˜ 7¨4¨5 >Ñ1Ó2€DÜ�Q˜˜aÓ Ð øôM ò àˆD�‰I‹ðüò As   ¡F* Ã	G Æ*F=Æ<F=)r´   )r·   r¼   r”   Únumpyr   Úmathr   Útypesr   Ú r   Úscipy.sparse.linalgÚsparseÚlinalgrº   Úscipy.sparser   Úscipy._lib._array_apir   r	   Ú	_bsplinesr
   r   Ú__all__r   r   r    Úgcrotmkr¤   rÇ   r`   r   r   Ú<module>rÔ      sŽ   ðÛ Û Û Û å Ý å ç !Ð !Ý "ß Bç +àˆ-€òñ Ø˜5ð	Dðô÷r
ð r
óðr
òh	J(ðZ !Ÿ[™[ó ð0J!¨s¯{©{õ J!r   