
     h)M                        d dl mZmZmZmZmZmZmZmZm	Z	m
Z
mZ d dlmZmZmZmZmZmZmZmZmZ ddlmZmZ d dlmZ d dlmZ g dZdd	Zi Zd
 Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*ddZ+ddZ,ddZ-ddZ.dS )    )logical_andasarraypi
zeros_like	piecewisearrayarctan2tanzerosarangefloor)	sqrtexpgreaterlesscosaddsin
less_equalgreater_equal   )	cspline2dsepfir2d)comb)float_factorial)	spline_filterbsplinegauss_splinecubic	quadratic	cspline1d	qspline1dcspline1d_evalqspline1d_eval      @c                    | j         j        }t          g dd          dz  }|dv r}|                     d          } t	          | j        |          }t	          | j        |          }t          |||          }t          |||          }|d|z  z                       |          }nJ|dv r7t	          | |          }t          |||          }|                    |          }nt          d          |S )	a3  Smoothing spline (cubic) filtering of a rank-2 array.

    Filter an input data set, `Iin`, using a (cubic) smoothing spline of
    fall-off `lmbda`.

    Parameters
    ----------
    Iin : array_like
        input data set
    lmbda : float, optional
        spline smooghing fall-off value, default is `5.0`.

    Returns
    -------
    res : ndarray
        filterd input data

    Examples
    --------
    We can filter an multi dimentional signal (ex: 2D image) using cubic
    B-spline filter:

    >>> import numpy as np
    >>> from scipy.signal import spline_filter
    >>> import matplotlib.pyplot as plt
    >>> orig_img = np.eye(20)  # create an image
    >>> orig_img[10, :] = 1.0
    >>> sp_filter = spline_filter(orig_img, lmbda=0.1)
    >>> f, ax = plt.subplots(1, 2, sharex=True)
    >>> for ind, data in enumerate([[orig_img, "original image"],
    ...                             [sp_filter, "spline filter"]]):
    ...     ax[ind].imshow(data[0], cmap='gray_r')
    ...     ax[ind].set_title(data[1])
    >>> plt.tight_layout()
    >>> plt.show()

    )      ?g      @r'   f      @)FDr*   y              ?)r(   dzInvalid data type for Iin)	dtypecharr   astyper   realimagr   	TypeError)	Iinlmbdaintypehcolckrckioutroutiouts	            R/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/scipy/signal/_bsplines.pyr   r      s    L Y^F#&&,Djjoo%((%((T4((T4((b4i''//	:		U##sD$''jj  3444J    c           	         	 	 t                     S # t          $ r Y nw xY wd } dz  dz   } dz  rd}nd} |dd|          g}|t          d|dz
            D ]*}|                     |ddz
                       dz
  +|                     |dd dz    dz                       t	                      fd		fd	t          |          D             }||ft            <   ||fS )
a  Returns the function defined over the left-side pieces for a bspline of
    a given order.

    The 0th piece is the first one less than 0. The last piece is a function
    identical to 0 (returned as the constant 0). (There are order//2 + 2 total
    pieces).

    Also returns the condition functions that when evaluated return boolean
    arrays for use with `numpy.piecewise`.
    c                 @    | dk    rfdS | dk    rfdS fdS )Nr   c                 \    t          t          |           t          |                     S N)r   r   r   xval1val2s    r<   <lambda>z>_bspline_piecefunctions.<locals>.condfuncgen.<locals>.<lambda>]   s,    [At)<)<)6q$)?)?A A r=      c                 $    t          |           S rA   )r   )rC   rE   s    r<   rF   z>_bspline_piecefunctions.<locals>.condfuncgen.<locals>.<lambda>`   s    Z400 r=   c                 \    t          t          |           t          |                     S rA   )r   r   r   rB   s    r<   rF   z>_bspline_piecefunctions.<locals>.condfuncgen.<locals>.<lambda>b   s*    [a)6q$)?)?A A r=    )numrD   rE   s    ``r<   condfuncgenz,_bspline_piecefunctions.<locals>.condfuncgen[   sm    !88A A A A A AAXX00000A A A A A Ar=   rG   g      g      r   r          @c                     dz  | z
  dk     rdS fdt          dz             D             fdt          dz             D             fd}|S )NrG   r   c           
      r    g | ]3}d d|dz  z  z
  t          t          d z   |d                     z  z  4S )r   rG   )exact)floatr   ).0kfvalorders     r<   
<listcomp>zA_bspline_piecefunctions.<locals>.piecefuncgen.<locals>.<listcomp>}   sZ     * * * qAE{?eDAQ,G,G,G&H&HH4O * * *r=   r   c                     g | ]} |z
  	S rJ   rJ   )rR   rS   bounds     r<   rV   zA_bspline_piecefunctions.<locals>.piecefuncgen.<locals>.<listcomp>   s    4445&1*444r=   c                 j    d}t          dz             D ]}||         | |         z   z  z  z  }|S )N        r   range)rC   resrS   MkcoeffsrU   shiftss      r<   thefuncz>_bspline_piecefunctions.<locals>.piecefuncgen.<locals>.thefunc   sH    C26]] < <vayAq	Me#;;;Jr=   r[   )rK   ra   r^   r_   r`   rX   rT   rU   s     @@@r<   piecefuncgenz-_bspline_piecefunctions.<locals>.piecefuncgeny   s    aZ#FF1* * * * * a==* * *4444eBFmm444	 	 	 	 	 	 	 	
 r=   c                 &    g | ]} |          S rJ   rJ   )rR   rS   rb   s     r<   rV   z+_bspline_piecefunctions.<locals>.<listcomp>   s!    555AQ555r=   )_splinefunc_cacheKeyErrorr\   appendr   )
rU   rL   last
startbound	condfuncsrK   funclistrX   rT   rb   s
   `      @@@r<   _bspline_piecefunctionsrk   K   ss    ''   A A A A:>Dqy 


Q:../IEQq!!  Quqy99:::	[[A|c'9::;;; 5!!D       6555t555H ()4eYs    
  c                     t          t          |                      t          |          \  }}fd|D             }t          ||          S )aw  B-spline basis function of order n.

    Parameters
    ----------
    x : array_like
        a knot vector
    n : int
        The order of the spline. Must be non-negative, i.e., n >= 0

    Returns
    -------
    res : ndarray
        B-spline basis function values

    See Also
    --------
    cubic : A cubic B-spline.
    quadratic : A quadratic B-spline.

    Notes
    -----
    Uses numpy.piecewise and automatic function-generator.

    Examples
    --------
    We can calculate B-Spline basis function of several orders:

    >>> import numpy as np
    >>> from scipy.signal import bspline, cubic, quadratic
    >>> bspline(0.0, 1)
    1

    >>> knots = [-1.0, 0.0, -1.0]
    >>> bspline(knots, 2)
    array([0.125, 0.75, 0.125])

    >>> np.array_equal(bspline(knots, 2), quadratic(knots))
    True

    >>> np.array_equal(bspline(knots, 3), cubic(knots))
    True

    c                 &    g | ]} |          S rJ   rJ   )rR   funcaxs     r<   rV   zbspline.<locals>.<listcomp>   s!    ///TR///r=   )absr   rk   r   )rC   nrj   ri   condlistro   s        @r<   r   r      sW    X gajj//	B1!44Hi////Y///HR8,,,r=   c                     t          |           } |dz   dz  }dt          dt          z  |z            z  t          | dz   dz  |z            z  S )a  Gaussian approximation to B-spline basis function of order n.

    Parameters
    ----------
    x : array_like
        a knot vector
    n : int
        The order of the spline. Must be non-negative, i.e., n >= 0

    Returns
    -------
    res : ndarray
        B-spline basis function values approximated by a zero-mean Gaussian
        function.

    Notes
    -----
    The B-spline basis function can be approximated well by a zero-mean
    Gaussian function with standard-deviation equal to :math:`\sigma=(n+1)/12`
    for large `n` :

    .. math::  \frac{1}{\sqrt {2\pi\sigma^2}}exp(-\frac{x^2}{2\sigma})

    References
    ----------
    .. [1] Bouma H., Vilanova A., Bescos J.O., ter Haar Romeny B.M., Gerritsen
       F.A. (2007) Fast and Accurate Gaussian Derivatives Based on B-Splines. In:
       Sgallari F., Murli A., Paragios N. (eds) Scale Space and Variational
       Methods in Computer Vision. SSVM 2007. Lecture Notes in Computer
       Science, vol 4485. Springer, Berlin, Heidelberg
    .. [2] http://folk.uio.no/inf3330/scripting/doc/python/SciPy/tutorial/old/node24.html

    Examples
    --------
    We can calculate B-Spline basis functions approximated by a gaussian
    distribution:

    >>> import numpy as np
    >>> from scipy.signal import gauss_spline, bspline
    >>> knots = np.array([-1.0, 0.0, -1.0])
    >>> gauss_spline(knots, 3)
    array([0.15418033, 0.6909883, 0.15418033])  # may vary

    >>> bspline(knots, 3)
    array([0.16666667, 0.66666667, 0.16666667])  # may vary

    r   g      (@rG   )r   r   r   r   )rC   rq   signsqs      r<   r   r      sT    ` 	

A!et^FtAFVO$$$sAF7Q;+?'@'@@@r=   c                 X   t          t          |                     }t          |          }t          |d          }|                                r||         }dd|dz  z  d|z
  z  z
  ||<   | t          |d          z  }|                                r||         }dd|z
  dz  z  ||<   |S )a-  A cubic B-spline.

    This is a special case of `bspline`, and equivalent to ``bspline(x, 3)``.

    Parameters
    ----------
    x : array_like
        a knot vector

    Returns
    -------
    res : ndarray
        Cubic B-spline basis function values

    See Also
    --------
    bspline : B-spline basis function of order n
    quadratic : A quadratic B-spline.

    Examples
    --------
    We can calculate B-Spline basis function of several orders:

    >>> import numpy as np
    >>> from scipy.signal import bspline, cubic, quadratic
    >>> bspline(0.0, 1)
    1

    >>> knots = [-1.0, 0.0, -1.0]
    >>> bspline(knots, 2)
    array([0.125, 0.75, 0.125])

    >>> np.array_equal(bspline(knots, 2), quadratic(knots))
    True

    >>> np.array_equal(bspline(knots, 3), cubic(knots))
    True

    r   gUUUUUU?      ?rG   gUUUUUU?   rp   r   r   r   anyrC   ro   r]   cond1ax1cond2ax2s          r<   r   r      s    P 
WQZZB
R..CQKKEyy{{ >iw1QW==E
FT"a[[ Eyy{{ .iCA~-E
Jr=   c                 F   t          t          |                     }t          |          }t          |d          }|                                r||         }d|dz  z
  ||<   | t          |d          z  }|                                r||         }|dz
  dz  dz  ||<   |S )a-  A quadratic B-spline.

    This is a special case of `bspline`, and equivalent to ``bspline(x, 2)``.

    Parameters
    ----------
    x : array_like
        a knot vector

    Returns
    -------
    res : ndarray
        Quadratic B-spline basis function values

    See Also
    --------
    bspline : B-spline basis function of order n
    cubic : A cubic B-spline.

    Examples
    --------
    We can calculate B-Spline basis function of several orders:

    >>> import numpy as np
    >>> from scipy.signal import bspline, cubic, quadratic
    >>> bspline(0.0, 1)
    1

    >>> knots = [-1.0, 0.0, -1.0]
    >>> bspline(knots, 2)
    array([0.125, 0.75, 0.125])

    >>> np.array_equal(bspline(knots, 2), quadratic(knots))
    True

    >>> np.array_equal(bspline(knots, 3), cubic(knots))
    True

    rv   g      ?rG         ?rM   rx   rz   s          r<   r    r    ,  s    P 
WQZZB
R..CSMMEyy{{ %iC1H_E
FT"c]]"Eyy{{ ,iCiA%+E
Jr=   c           
      V   dd| z  z
  d| z  t          dd| z  z             z  z   }t          t          d| z  dz
            t          |                    }d| z  dz
  t          |          z
  d| z  z  }|t          d| z  d| z  t          dd| z  z             z  z   |z            z  }||fS )Nr   `      rw      0   )r   r	   )lamxiomegrhos       r<   _coeff_smoothr   a  s    	
R#XS4C#I#6#66	6B4c	A&&R11D8a<$r(("rCx
0C
b3hcDS3Y,?,?!??2EFF
FC9r=   c                     |t          |          z  || z  z  t          || dz   z            z  t          | d          z  S )Nr   )r   r   )rS   csr   omegas       r<   _hcr   i  sB    UOsax(3uA+?+??ArNN r=   c                 <   ||z  d||z  z   z  d||z  z
  z  dd|z  |z  t          d|z            z  z
  |dz  z   z  }d||z  z
  d||z  z   z  t          |          z  }t          |           }|||z  z  t          ||z            |t          ||z            z  z   z  S )Nr   rG      )r   r
   rp   r   )rS   r   r   r   c0gammaaks          r<   _hsr   n  s    
r'Qs]
#q39}
5q3w}s1u9~~--q8:Bs]q39}-E

:E	QBr	>S__us52:/FFGGr=   c           	         t          |          \  }}dd|z  t          |          z  z
  ||z  z   }t          |           }t          |f| j        j                  }t          |          }t          d|||          | d         z  t          j	        t          |dz   |||          | z            z   |d<   t          d|||          | d         z  t          d|||          | d         z  z   t          j	        t          |dz   |||          | z            z   |d<   t          d|          D ]D}|| |         z  d|z  t          |          z  ||dz
           z  z   ||z  ||dz
           z  z
  ||<   Et          |f| j        j                  }	t          j	        t          ||||          t          |dz   |||          z   | d d d         z            |	|dz
  <   t          j	        t          |dz
  |||          t          |dz   |||          z   | d d d         z            |	|dz
  <   t          |dz
  dd          D ]D}|||         z  d|z  t          |          z  |	|dz            z  z   ||z  |	|dz            z  z
  |	|<   E|	S )Nr   rG   r   r   rw   )r   r   lenr   r-   r.   r   r   r   reducer\   r   )
signallambr   r   r   KyprS   rq   ys
             r<   _cubic_smooth_coeffr   v  s   t$$JC	
QWs5zz!	!C#I	-BFA	tV\&	'	'Bq		ABU##fQi/ZAE2sE22V;<<=BqE BU##fQi/BU##fQi/0ZAE2sE22V;<<=BqE 1a[[ ( (fQi!c'CJJ"6AE"BBsRAY&'1 	qdFL%&&Az3q"c511q1ub#u5569?"F G GAa!eHz3q1ub#u55q1ub#u5569?"F G GAa!eH 1q5"b!! & &RU
QWs5zz1Aa!eH<<c	Aa!eH$%! Hr=   c                    dt          d          z   }t          |           }t          |f| j        j                  }|t          |          z  }| d         |t          j        || z            z  z   |d<   t          d|          D ]}| |         |||dz
           z  z   ||<   t          |f| j                  }||dz
  z  ||dz
           z  ||dz
  <   t          |dz
  dd          D ]}|||dz            ||         z
  z  ||<   |dz  S )Nrw   r   r   rG   r   r)   	r   r   r   r-   r.   r   r   r   r\   r   zir   ypluspowersrS   outputs          r<   _cubic_coeffr     s   	d1ggBFA1$)**E6!99_Fay2
6F? ; ;;;E!H1a[[ 1 1!9rE!a%L00aA4&&F"q&ME!a%L0F1q5M1q5"b!! 4 4&Q-%(23q		C<r=   c                     ddt          d          z  z   }t          |           }t          |f| j        j                  }|t          |          z  }| d         |t          j        || z            z  z   |d<   t          d|          D ]}| |         |||dz
           z  z   ||<   t          |f| j        j                  }||dz
  z  ||dz
           z  ||dz
  <   t          |dz
  dd          D ]}|||dz            ||         z
  z  ||<   |dz  S )NrG   rM   r   r   r   g       @r   r   s          r<   _quadratic_coeffr     s%   	a$s))m	BFA1$)**E6!99_Fay2
6F? ; ;;;E!H1a[[ 1 1!9rE!a%L00aA4*++F"q&ME!a%L0F1q5M1q5"b!! 4 4&Q-%(23q		C<r=   rZ   c                 L    |dk    rt          | |          S t          |           S )a  
    Compute cubic spline coefficients for rank-1 array.

    Find the cubic spline coefficients for a 1-D signal assuming
    mirror-symmetric boundary conditions. To obtain the signal back from the
    spline representation mirror-symmetric-convolve these coefficients with a
    length 3 FIR window [1.0, 4.0, 1.0]/ 6.0 .

    Parameters
    ----------
    signal : ndarray
        A rank-1 array representing samples of a signal.
    lamb : float, optional
        Smoothing coefficient, default is 0.0.

    Returns
    -------
    c : ndarray
        Cubic spline coefficients.

    See Also
    --------
    cspline1d_eval : Evaluate a cubic spline at the new set of points.

    Examples
    --------
    We can filter a signal to reduce and smooth out high-frequency noise with
    a cubic spline:

    >>> import numpy as np
    >>> import matplotlib.pyplot as plt
    >>> from scipy.signal import cspline1d, cspline1d_eval
    >>> rng = np.random.default_rng()
    >>> sig = np.repeat([0., 1., 0.], 100)
    >>> sig += rng.standard_normal(len(sig))*0.05  # add noise
    >>> time = np.linspace(0, len(sig))
    >>> filtered = cspline1d_eval(cspline1d(sig), time)
    >>> plt.plot(sig, label="signal")
    >>> plt.plot(time, filtered, label="filtered")
    >>> plt.legend()
    >>> plt.show()

    rZ   )r   r   r   r   s     r<   r!   r!     s,    X s{{"64000F###r=   c                 J    |dk    rt          d          t          |           S )aF  Compute quadratic spline coefficients for rank-1 array.

    Parameters
    ----------
    signal : ndarray
        A rank-1 array representing samples of a signal.
    lamb : float, optional
        Smoothing coefficient (must be zero for now).

    Returns
    -------
    c : ndarray
        Quadratic spline coefficients.

    See Also
    --------
    qspline1d_eval : Evaluate a quadratic spline at the new set of points.

    Notes
    -----
    Find the quadratic spline coefficients for a 1-D signal assuming
    mirror-symmetric boundary conditions. To obtain the signal back from the
    spline representation mirror-symmetric-convolve these coefficients with a
    length 3 FIR window [1.0, 6.0, 1.0]/ 8.0 .

    Examples
    --------
    We can filter a signal to reduce and smooth out high-frequency noise with
    a quadratic spline:

    >>> import numpy as np
    >>> import matplotlib.pyplot as plt
    >>> from scipy.signal import qspline1d, qspline1d_eval
    >>> rng = np.random.default_rng()
    >>> sig = np.repeat([0., 1., 0.], 100)
    >>> sig += rng.standard_normal(len(sig))*0.05  # add noise
    >>> time = np.linspace(0, len(sig))
    >>> filtered = qspline1d_eval(qspline1d(sig), time)
    >>> plt.plot(sig, label="signal")
    >>> plt.plot(time, filtered, label="filtered")
    >>> plt.legend()
    >>> plt.show()

    rZ   z.Smoothing quadratic splines not supported yet.)
ValueErrorr   r   s     r<   r"   r"     s+    Z s{{IJJJ'''r=   r'   c                    t          |          |z
  t          |          z  }t          || j                  }|j        dk    r|S t          |           }|dk     }||dz
  k    }||z   }t          | ||                    ||<   t          | d|dz
  z  ||         z
            ||<   ||         }|j        dk    r|S t          || j                  }	t          |dz
                                t                    dz   }
t          d          D ]>}|
|z   }|                    d|dz
            }|	| |         t          ||z
            z  z  }	?|	||<   |S )a  Evaluate a cubic spline at the new set of points.

    `dx` is the old sample-spacing while `x0` was the old origin. In
    other-words the old-sample points (knot-points) for which the `cj`
    represent spline coefficients were at equally-spaced points of:

      oldx = x0 + j*dx  j=0...N-1, with N=len(cj)

    Edges are handled using mirror-symmetric boundary conditions.

    Parameters
    ----------
    cj : ndarray
        cublic spline coefficients
    newx : ndarray
        New set of points.
    dx : float, optional
        Old sample-spacing, the default value is 1.0.
    x0 : int, optional
        Old origin, the default value is 0.

    Returns
    -------
    res : ndarray
        Evaluated a cubic spline points.

    See Also
    --------
    cspline1d : Compute cubic spline coefficients for rank-1 array.

    Examples
    --------
    We can filter a signal to reduce and smooth out high-frequency noise with
    a cubic spline:

    >>> import numpy as np
    >>> import matplotlib.pyplot as plt
    >>> from scipy.signal import cspline1d, cspline1d_eval
    >>> rng = np.random.default_rng()
    >>> sig = np.repeat([0., 1., 0.], 100)
    >>> sig += rng.standard_normal(len(sig))*0.05  # add noise
    >>> time = np.linspace(0, len(sig))
    >>> filtered = cspline1d_eval(cspline1d(sig), time)
    >>> plt.plot(sig, label="signal")
    >>> plt.plot(time, filtered, label="filtered")
    >>> plt.legend()
    >>> plt.show()

    )r-   r   r   rG   r   )r   rQ   r   r-   sizer   r#   r   r/   intr\   clipr   cjnewxdxx0r]   Nr{   r}   cond3resultjlowerithisjindjs                 r<   r#   r#     sa   d DMMB%))+D
T
*
*
*C
x1}}
BA1HEAENEemET%[L11CJAQK$u+$=>>CJ;DyA~~
BH---F4!8__##C((1,F1XX 1 1
zz!QU##"T(U4%<0000CJJr=   c                 p   t          |          |z
  |z  }t          |          }|j        dk    r|S t          |           }|dk     }||dz
  k    }||z   }t	          | ||                    ||<   t	          | d|dz
  z  ||         z
            ||<   ||         }|j        dk    r|S t          |          }	t          |dz
                                t                    dz   }
t          d          D ]>}|
|z   }|	                    d|dz
            }|	| |         t          ||z
            z  z  }	?|	||<   |S )a  Evaluate a quadratic spline at the new set of points.

    Parameters
    ----------
    cj : ndarray
        Quadratic spline coefficients
    newx : ndarray
        New set of points.
    dx : float, optional
        Old sample-spacing, the default value is 1.0.
    x0 : int, optional
        Old origin, the default value is 0.

    Returns
    -------
    res : ndarray
        Evaluated a quadratic spline points.

    See Also
    --------
    qspline1d : Compute quadratic spline coefficients for rank-1 array.

    Notes
    -----
    `dx` is the old sample-spacing while `x0` was the old origin. In
    other-words the old-sample points (knot-points) for which the `cj`
    represent spline coefficients were at equally-spaced points of::

      oldx = x0 + j*dx  j=0...N-1, with N=len(cj)

    Edges are handled using mirror-symmetric boundary conditions.

    Examples
    --------
    We can filter a signal to reduce and smooth out high-frequency noise with
    a quadratic spline:

    >>> import numpy as np
    >>> import matplotlib.pyplot as plt
    >>> from scipy.signal import qspline1d, qspline1d_eval
    >>> rng = np.random.default_rng()
    >>> sig = np.repeat([0., 1., 0.], 100)
    >>> sig += rng.standard_normal(len(sig))*0.05  # add noise
    >>> time = np.linspace(0, len(sig))
    >>> filtered = qspline1d_eval(qspline1d(sig), time)
    >>> plt.plot(sig, label="signal")
    >>> plt.plot(time, filtered, label="filtered")
    >>> plt.legend()
    >>> plt.show()

    r   r   rG   r   rw   )r   r   r   r   r$   r   r/   r   r\   r   r    r   s                 r<   r$   r$   b  sO   h DMMB"$D
T

C
x1}}
BA1HEAENEemET%[L11CJAQK$u+$=>>CJ;DyA~~
F4#:%%c**Q.F1XX 5 5
zz!QU##"T(Yte|4444CJJr=   N)r%   )rZ   )r'   r   )/numpyr   r   r   r   r   r   r	   r
   r   r   r   numpy.core.umathr   r   r   r   r   r   r   r   r   _spliner   r   scipy.specialr   scipy._lib._utilr   __all__r   rd   rk   r   r   r   r    r   r   r   r   r   r   r!   r"   r#   r$   rJ   r=   r<   <module>r      s  I I I I I I I I I I I I I I I I I I I I I I I I I I9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ) ( ( ( ( ( ( (       , , , , , ,I I I5 5 5 5p  A A AH0- 0- 0-f2A 2A 2Aj2 2 2j2 2 2j    
H H H  >    /$ /$ /$ /$d0( 0( 0( 0(fG G G GTI I I I I Ir=   