ó
    ‰*£hL'  ã                   óˆ   • S SK JrJr  S SKJrJr  S SKJrJr  S SK	J
r
  S SKJr  S SKJr  S rS r\" S	S
9S 5       rS rS rg)é    )ÚSÚsympify)ÚDummyÚsymbols)Ú	PiecewiseÚpiecewise_fold)ÚAnd)ÚInterval)Ú	lru_cachec                 óê   • [        U [        5      (       aQ  [        U R                  5      S:X  a8  U R                  u  p#UR                  U:X  a  X2p2UR                  UR
                  4$ [        SU -  5      e)zÂreturn the interval corresponding to the condition

Conditions in spline's Piecewise give the range over
which an expression is valid like (lo <= x) & (x <= hi).
This function returns (lo, hi).
é   zunexpected cond type: %s)Ú
isinstancer	   ÚlenÚargsÚltsÚgtsÚ	TypeError)ÚcondÚxÚaÚbs       Ú]/home/mande/repo/quber/.venv/lib/python3.13/site-packages/sympy/functions/special/bsplines.pyÚ_ivlr   
   s^   € ô �$œ×Ñ¤ T§Y¡Y£°1Ó!4Ø�y‰y‰ˆØ�5‰5�A‹:ØˆqØ�u‰u�a—e‘eˆ|ÐÜ
Ð.°Ñ5Ó
6Ð6ó    c                 ó"  • [         R                  X4;   a  [        X#-  5      nUR                  5       $ [         R                  X24;   a  [        X-  5      nUR                  5       $ / n[        X-  5      n[        X#-  5      n[        UR                  SS 5      n	UR                  SS  H¨  n
U
R
                  nU
R                  n[        XÄ5      S   n[        U	5       H^  u  pïUR
                  nUR                  n[        UU5      u  nnUU:X  a	  UU-  nXž	   O'UU:  d  MC  UU::  d  MK  UR                  U5        Xž	   O   UR                  X¼45        Mª     UR                  U	5        UR                  S5        [        USS06nUR                  5       $ )zConstruct c*b1 + d*b2.Néÿÿÿÿr   ©r   TÚevaluateF)r   ÚZeror   Úlistr   Úexprr   r   Ú	enumerateÚappendÚextendr   Úexpand)ÚcÚb1ÚdÚb2r   ÚrvÚnew_argsÚp1Úp2Úp2argsÚargr!   r   ÚlowerÚiÚarg2Úexpr2Úcond2Úlower_2Úupper_2s                       r   Ú_add_splinesr7      s}  € ô 	‡v�v�"�ÓÜ˜A™FÓ#ˆðh �9‰9‹;Ðôg 
�‰�B�7Ó	Ü˜A™FÓ#ˆðd �9‰9‹;Ðða ˆä˜A™FÓ#ˆÜ˜A™FÓ#ˆô �b—g‘g˜c˜r�lÓ#ˆð —7‘7˜3˜B“<ˆCØ—8‘8ˆDØ—8‘8ˆDä˜“M !Ñ$ˆEô % VÖ,‘�ØŸ	™	�ØŸ	™	�ä#'¨¨q£>Ñ �˜Ø˜D“=à˜E‘M�Dà˜	áØ˜u•_¨°EÕ)9ð —O‘O DÔ)Ø˜	Ùñ% -ð* �O‰O˜T˜LÖ)ñ9  ð> 	�‰˜Ôð 	�‰˜	Ô"ä˜Ð1¨5Ñ1ˆà�9‰9‹;Ðr   é€   )Úmaxsizec           	      óò  • Un[        5       n[        S U 5       5      n[        U 5      n [        U5      n[        U5      nUS-
  nX -   S-   U:”  a  [	        S5      eU S:X  a=  [        [        R                  [        X   XS-      5      R                  U5      4S5      nOÉU S:”  aµ  XU -   S-      XS-      -
  nU[        R                  :w  a$  XU -   S-      U-
  U-  n	[        U S-
  XS-   U5      n
O[        R                  =p©XU -      X   -
  nU[        R                  :w  a  X1U   -
  U-  n[        U S-
  XU5      nO[        R                  =pË[        X¼XšU5      nO[	        SU-  5      eUR                  X405      $ )aL  
The $n$-th B-spline at $x$ of degree $d$ with knots.

Explanation
===========

B-Splines are piecewise polynomials of degree $d$. They are defined on a
set of knots, which is a sequence of integers or floats.

Examples
========

The 0th degree splines have a value of 1 on a single interval:

    >>> from sympy import bspline_basis
    >>> from sympy.abc import x
    >>> d = 0
    >>> knots = tuple(range(5))
    >>> bspline_basis(d, knots, 0, x)
    Piecewise((1, (x >= 0) & (x <= 1)), (0, True))

For a given ``(d, knots)`` there are ``len(knots)-d-1`` B-splines
defined, that are indexed by ``n`` (starting at 0).

Here is an example of a cubic B-spline:

    >>> bspline_basis(3, tuple(range(5)), 0, x)
    Piecewise((x**3/6, (x >= 0) & (x <= 1)),
              (-x**3/2 + 2*x**2 - 2*x + 2/3,
              (x >= 1) & (x <= 2)),
              (x**3/2 - 4*x**2 + 10*x - 22/3,
              (x >= 2) & (x <= 3)),
              (-x**3/6 + 2*x**2 - 8*x + 32/3,
              (x >= 3) & (x <= 4)),
              (0, True))

By repeating knot points, you can introduce discontinuities in the
B-splines and their derivatives:

    >>> d = 1
    >>> knots = (0, 0, 2, 3, 4)
    >>> bspline_basis(d, knots, 0, x)
    Piecewise((1 - x/2, (x >= 0) & (x <= 2)), (0, True))

It is quite time consuming to construct and evaluate B-splines. If
you need to evaluate a B-spline many times, it is best to lambdify them
first:

    >>> from sympy import lambdify
    >>> d = 3
    >>> knots = tuple(range(10))
    >>> b0 = bspline_basis(d, knots, 0, x)
    >>> f = lambdify(x, b0)
    >>> y = f(0.5)

Parameters
==========

d : integer
    degree of bspline

knots : list of integer values
    list of knots points of bspline

n : integer
    $n$-th B-spline

x : symbol

See Also
========

bspline_basis_set

References
==========

.. [1] https://en.wikipedia.org/wiki/B-spline

c              3   ó8   #   • U  H  n[        U5      v •  M     g 7f©N)r   )Ú.0Úks     r   Ú	<genexpr>Ú bspline_basis.<locals>.<genexpr>ª   s   é € Ð,¢e ”'˜!—*�*¢eùs   ‚é   z(n + d + 1 must not exceed len(knots) - 1r   r   zdegree must be non-negative: %r)r   ÚtupleÚintr   Ú
ValueErrorr   r   ÚOner
   Úcontainsr   Úbspline_basisr7   Úxreplace)r(   ÚknotsÚnr   ÚxvarÚn_knotsÚn_intervalsÚresultÚdenomÚBr)   ÚAr'   s                r   rG   rG   T   s~  € ðf €DÜ‹€AäÑ,¡eÓ,Ó,€EÜˆA‹€AÜˆA‹€AÜ�%‹j€GØ˜A‘+€KØ�uˆq�y�;ÓÜÐCÓDÐDØˆAƒvÜÜ�U‰U”H˜U™X u°©U¡|Ó4×=Ñ=¸aÓ@ÐAÀ9ó
‰ð 
ˆQ‹Ø˜!‘e˜a‘iÑ  5¨Q©¡<Ñ/ˆØ”A—F‘F‹?Ø˜1‘u˜q‘yÑ! AÑ%¨Ñ.ˆAÜ˜q 1™u e°©U°AÓ6‰Bä—V‘VˆOˆBà˜!‘e‘˜u™xÑ'ˆØ”A—F‘F‹?Ø˜1‘X‘ Ñ&ˆAÜ˜q 1™u e°Ó2‰Bä—V‘VˆOˆBä˜a Q¨AÓ.‰äÐ:¸QÑ>Ó?Ð?ð �?‰?˜A˜9Ó%Ð%r   c           	      óŽ   • [        U5      U -
  S-
  n[        U5       Vs/ s H  n[        U [        U5      XB5      PM     sn$ s  snf )að  
Return the ``len(knots)-d-1`` B-splines at *x* of degree *d*
with *knots*.

Explanation
===========

This function returns a list of piecewise polynomials that are the
``len(knots)-d-1`` B-splines of degree *d* for the given knots.
This function calls ``bspline_basis(d, knots, n, x)`` for different
values of *n*.

Examples
========

>>> from sympy import bspline_basis_set
>>> from sympy.abc import x
>>> d = 2
>>> knots = range(5)
>>> splines = bspline_basis_set(d, knots, x)
>>> splines
[Piecewise((x**2/2, (x >= 0) & (x <= 1)),
           (-x**2 + 3*x - 3/2, (x >= 1) & (x <= 2)),
           (x**2/2 - 3*x + 9/2, (x >= 2) & (x <= 3)),
           (0, True)),
Piecewise((x**2/2 - x + 1/2, (x >= 1) & (x <= 2)),
          (-x**2 + 5*x - 11/2, (x >= 2) & (x <= 3)),
          (x**2/2 - 4*x + 8, (x >= 3) & (x <= 4)),
          (0, True))]

Parameters
==========

d : integer
    degree of bspline

knots : list of integers
    list of knots points of bspline

x : symbol

See Also
========

bspline_basis

rA   )r   ÚrangerG   rB   )r(   rI   r   Ú	n_splinesr1   s        r   Úbspline_basis_setrU   Ì   sC   € ô` �E“
˜Q‘ Ñ"€IÜ:?À	Ô:JÓKÒ:J°QŒM˜!œU 5›\¨1Ö0Ñ:JÑKÐKùÒKs   Ÿ Ac                 óú  ^• SSK Jn  SSKJn  [	        U 5      n U R
                  (       a  U R                  (       d  [        SU -  5      e[        U5      [        U5      :w  a  [        S5      e[        U5      U S-   :  a  [        S5      e[        S [        X"SS	 5       5       5      (       d  [        S
5      eU Vs/ s H  n[	        U5      PM     nnU R                  (       a  U S-   S-  nX'U*  nO6U S-  n[        X'U* S-
   X'S-   U*  5       V	V
s/ s H  u  pšXš-   S-  PM     nn	n
US   /U S-   -  [        U5      -   US   /U S-   -  -   n[        XT5      nU VV
s/ s H$  oÜ V
s/ s H  oªR                  TU5      PM     sn
PM&     nnn
U" U" U5      U" U5      4[        SR!                  [        U5      5      ["        S95      n[        U5      S   nU V
VVs1 s H#  oªR$                    H  u  nnUS:w  d  M  UiM     M%     nnn
n['        UU4S jS9nU V
VVs/ s H%  oªR$                   VVs0 s H	  u  nnUU_M     snnPM'     nnn
n/ nU Hq  n[)        [        UU5       VV s/ s H)  u  nn UU R+                  U[,        R.                  5      -  PM+     sn n[,        R.                  5      nUR1                  UU45        Ms     [3        U6 $ s  snf s  sn
n	f s  sn
f s  sn
nf s  snnn
f s  snnf s  snnn
f s  sn nf )a„  
Return spline of degree *d*, passing through the given *X*
and *Y* values.

Explanation
===========

This function returns a piecewise function such that each part is
a polynomial of degree not greater than *d*. The value of *d*
must be 1 or greater and the values of *X* must be strictly
increasing.

Examples
========

>>> from sympy import interpolating_spline
>>> from sympy.abc import x
>>> interpolating_spline(1, x, [1, 2, 4, 7], [3, 6, 5, 7])
Piecewise((3*x, (x >= 1) & (x <= 2)),
        (7 - x/2, (x >= 2) & (x <= 4)),
        (2*x/3 + 7/3, (x >= 4) & (x <= 7)))
>>> interpolating_spline(3, x, [-2, 0, 1, 3, 4], [4, 2, 1, 1, 3])
Piecewise((7*x**3/117 + 7*x**2/117 - 131*x/117 + 2, (x >= -2) & (x <= 1)),
        (10*x**3/117 - 2*x**2/117 - 122*x/117 + 77/39, (x >= 1) & (x <= 4)))

Parameters
==========

d : integer
    Degree of Bspline strictly greater than equal to one

x : symbol

X : list of strictly increasing real values
    list of X coordinates through which the spline passes

Y : list of real values
    list of corresponding Y coordinates through which the spline passes

See Also
========

bspline_basis_set, interpolating_poly

r   )Úlinsolve)ÚMatrixz1Spline degree must be a positive integer, not %s.z/Number of X and Y coordinates must be the same.rA   z6Degree must be less than the number of control points.c              3   ó.   #   • U  H  u  pX:  v •  M     g 7fr<   © )r=   r   r   s      r   r?   Ú'interpolating_spline.<locals>.<genexpr>9  s   é € Ð/¢™˜ˆqŽu¢ùs   ‚Nz.The x-coordinates must be strictly increasing.r   r   zc0:{})ÚclsTc                 ó   >• [        U T5      $ r<   )r   )r&   r   s    €r   Ú<lambda>Ú&interpolating_spline.<locals>.<lambda>S  s   ø€ ´°Q¸´
r   )Úkey)Úsympy.solvers.solvesetrW   Úsympy.matrices.denserX   r   Ú
is_IntegerÚis_positiverD   r   ÚallÚzipÚis_oddr    rU   Úsubsr   Úformatr   r   ÚsortedÚsumÚgetr   r   r#   r   )r(   r   ÚXÚYrW   rX   r1   ÚjÚinterior_knotsr   r   rI   ÚbasisÚvrQ   ÚcoeffÚer&   Ú	intervalsÚbasis_dictsÚsplineÚpieces    `                    r   Úinterpolating_splinery      s·  ø€ õ\ 0Ý+ô 	�‹
€AØ�L�L˜QŸ]Ÿ]ÜÐLÈqÑPÓQÐQÜ
ˆ1ƒv”�Q“ÓÜÐJÓKÐKÜ
ˆ1ƒv��A‘ƒ~ÜÐQÓRÐRÜÑ/¤ Q¨!¨"¨¤Ó/×/Ñ/ÜÐIÓJÐJÙÓšQ˜Œ�Ž™Q€AÐð 	‡x‡xØ�‰U�q‰LˆØ˜a˜R˜‰à�‰Fˆä"% a¨Q¨B°©F m°Q¸1±uÀ¸r°]Ô"Cô
Ú"C™$˜!ˆQ‰U�AŒIÑ"Cð 	ñ 
ð ˆq‰TˆF�a˜!‘eÑœt NÓ3Ñ3°q¸±u°gÀÀQÁÑ6GÑG€Eä˜a¨Ó*€Eá01Ô2²¨1 Ó	&¢˜1�&‰&��AŽ,¡Ô	&±€AÑ2á‘f˜Q“i¡¨£Ð+¬W°W·^±^ÄCÈÃFÓ5KÔQVÑ-WÓX€EÜ�‹K˜‰N€EÙ!ÕDšE�q·µ¡f q¨!¸!¸t¹)—±‘™E€IÒDô �yÔ&:Ñ;€Iá8=Õ>º°1§v¢vÔ.¢v™V˜a �A�q’D¡vÕ.¹€KÒ>Ø€FÛˆÜÜ03°E¸;Ô0GÔHÒ0G¡f q¨!ˆQ�—‘�qœ!Ÿ&™&Ó!Ô!Ñ0GÒHÌ!Ï&É&ó
ˆð 	�‰�u˜a�jÖ!ñ	 ô
 �fÐÐùòC 	 ùó
ùò 
'ùÓ2ùô Eùó /ùÔ>ùó IsN   Â;KÄKÅ	KÅ&KÆKÇK#Ç:
K#ÈK0È0K*É K0É'0K7ËKË*K0N)Ú
sympy.corer   r   Úsympy.core.symbolr   r   Úsympy.functionsr   r   Úsympy.logic.boolalgr	   Úsympy.sets.setsr
   Ú	functoolsr   r   r7   rG   rU   ry   rZ   r   r   Ú<module>r€      sK   ðß !ß .ß 5Ý #Ý $å ò7ò8ñv �3Ññt&ó ðt&òn1Lóh\r   