
    doi$8                         S SK Jr  S SKJr  S SKJrJrJr  S SK	J
s  Jr  S SKJr  S SKJr  SSKJr    SSSS	.S
 jjrS rS rS r  SS jrg)    )float_factorial)numpy)array_namespacexp_swapaxes	xp_deviceN)
convolve1d)
_polyutils   )
axis_slice)xpdevicec                   X:  a  [        S5      e[        U S5      u  pUc  U	S:X  a  US-
  nOUnSUs=::  a  U :  d  O  [        S5      eUS;  a  [        S5      eUc  [        O[        UR	                  S5      5      nX!:  a  UR                  XR                  US9n
U
$ UR                  U* X-
  UR                  US9nUS	:X  a  UR                  U5      nUR                  UR                  US
-   UR                  US9S5      nX-  nUR                  US
-   UR                  US9n[        R                  " X5      R                  [        U5      X2-  -  5      n[        R                  " XUS9u  n
    nU
$ )a
  Compute the coefficients for a 1-D Savitzky-Golay FIR filter.

Parameters
----------
window_length : int
    The length of the filter window (i.e., the number of coefficients).
polyorder : int
    The order of the polynomial used to fit the samples.
    `polyorder` must be less than `window_length`.
deriv : int, optional
    The order of the derivative to compute. This must be a
    nonnegative integer. The default is 0, which means to filter
    the data without differentiating.
delta : float, optional
    The spacing of the samples to which the filter will be applied.
    This is only used if deriv > 0.
pos : int or None, optional
    If pos is not None, it specifies evaluation position within the
    window. The default is the middle of the window.
use : str, optional
    Either 'conv' or 'dot'. This argument chooses the order of the
    coefficients. The default is 'conv', which means that the
    coefficients are ordered to be used in a convolution. With
    use='dot', the order is reversed, so the filter is applied by
    dotting the coefficients with the data set.

Returns
-------
coeffs : 1-D ndarray
    The filter coefficients.

See Also
--------
savgol_filter

Notes
-----
.. versionadded:: 0.14.0

References
----------
A. Savitzky, M. J. E. Golay, Smoothing and Differentiation of Data by
Simplified Least Squares Procedures. Analytical Chemistry, 1964, 36 (8),
pp 1627-1639.
Jianwen Luo, Kui Ying, and Jing Bai. 2005. Savitzky-Golay smoothing and
differentiation filter for even number data. Signal Process.
85, 7 (July 2005), 1429-1434.

Examples
--------
>>> import numpy as np
>>> from scipy.signal import savgol_coeffs
>>> savgol_coeffs(5, 2)
array([-0.08571429,  0.34285714,  0.48571429,  0.34285714, -0.08571429])
>>> savgol_coeffs(5, 2, deriv=1)
array([ 2.00000000e-01,  1.00000000e-01,  2.07548111e-16, -1.00000000e-01,
       -2.00000000e-01])

Note that use='dot' simply reverses the coefficients.

>>> savgol_coeffs(5, 2, pos=3)
array([ 0.25714286,  0.37142857,  0.34285714,  0.17142857, -0.14285714])
>>> savgol_coeffs(5, 2, pos=3, use='dot')
array([-0.14285714,  0.17142857,  0.34285714,  0.37142857,  0.25714286])
>>> savgol_coeffs(4, 2, pos=3, deriv=1, use='dot')
array([0.45,  -0.85,  -0.65,  1.05])

`x` contains data from the parabola x = t**2, sampled at
t = -1, 0, 1, 2, 3.  `c` holds the coefficients that will compute the
derivative at the last position.  When dotted with `x` the result should
be 6.

>>> x = np.array([1, 0, 1, 4, 9])
>>> c = savgol_coeffs(5, 2, pos=4, deriv=1, use='dot')
>>> c.dot(x)
6.0
z*polyorder must be less than window_length.   r   g      ?z4pos must be nonnegative and less than window_length.)convdotz`use` must be 'conv' or 'dot'dtyper   r   r
   r
   r   )
ValueErrordivmod	np_compatr   emptyzerosfloat64arangeflipreshapexpxatsetr   _pu_lstsq)window_length	polyorderderivdeltaposuser   r   halflenremcoeffsxorderAy_s                   X/var/www/html/land-ocr/venv/lib/python3.13/site-packages/scipy/signal/_savitzky_golay.pysavgol_coeffsr4      s{   x !EFF-+LG
{!8C-CC$}$ * + 	+ /!899 jobhhqk&BB-zz&I 			3$+2::f	MA
f}GGAJJJ
		)a-rzz&	A7E 	

A 	Qbjj@A 	q_U3u~FGA jj"-OFAq!M    c          
         US:X  a  U nU$ U R                   S   nXA::  a  UR                  U SS2S4   5      nU$ UR                  U SU* 2S4   SS9n[        U5       H]  nUR	                  XF-
  S-
  X-
  S-
  SU R
                  [        U 5      S9nXRR                  XtU-
  4S	U R                  S-
  -  -   5      -  nM_     UnU$ )
a4  Differentiate polynomials represented with coefficients.

p must be a 1-D or 2-D array.  In the 2-D case, each column gives
the coefficients of a polynomial; the first row holds the coefficients
associated with the highest power. m must be a nonnegative integer.
(numpy.polyder doesn't handle the 2-D case.)
r   Nr
   .T)copyr   r   )r
   )	shape
zeros_likeasarrayranger   r   r   r   ndim)pmr   resultndpkrngs           r3   _polyderrD      s     	Av M GGAJ6]]1RaRW:.F M Acrc3hKd3B1XiiEAIquqy"AGGIaL    jj1uh!1D&DEE	 
 FMr5   c
           
      V   [        U 5      n
[        XX%S9nUS:X  d  XPR                  * :X  a  UnSnO[        XSU
5      nSnU
R	                  XR
                  S   S45      n[        R                  " U
R                  SX!-
  U R                  [        U 5      S9XU
S9nUS:  a
  [        XU
S9nU
R                  X1-
  XA-
  UR                  [        U5      S9n[        R                  " XR	                  US5      U
S9X-  -  n[        U	R
                  5      nUU   US   sUS'   UU'   U
R	                  UXC-
  /US	S
 Q75      nU(       a  [        USXZ5      n[        S
5      /U	R                  -  n[        X45      UU'   [        R                   " U	[#        U5      5      R%                  U5      n	U	$ )a-  
Given an N-d array `x` and the specification of a slice of `x` from
`window_start` to `window_stop` along `axis`, create an interpolating
polynomial of each 1-D slice, and evaluate that polynomial in the slice
from `interp_start` to `interp_stop`. Put the result into the
corresponding slice of `y`.
)startstopaxisr   FTr   r   r   r   r
   N)r   r   r<   r   r   r8   r#   polyfitr   r   r   rD   polyvallistslicer    r!   tupler"   )r.   window_startwindow_stopinterp_startinterp_stoprH   r&   r'   r(   r1   r   x_edgexx_edgeswappedpoly_coeffsivaluesshpy_slices                      r3   	_fit_edgerZ      s    
	B KKFqyDVVGOfAr2jj==#3R"89G ++
		{)1 	 	
"K qy{b9 			#[%?	+(> 	 	A [[jjG&<DWF qww-CD	3q6CFCIZZ!; Fc!"g FGFVQ1T{maff$G,4GDMq%.!%%f-AHr5   c                 z    US-  n[        U SUSXuX#XF5
      nU R                  U   n[        XU-
  XU-
  XX#XF5
      nU$ )z
Use polynomial interpolation of x at the low and high ends of the axis
to fill in the halflen values in y.

This function just calls _fit_edge twice, once for each end of the axis.
r   r   )rZ   r8   )	r.   r%   r&   r'   r(   rH   r1   r+   r@   s	            r3   _fit_edges_polyfitr\      sY     q G!Qq'	*A	A!&w;	*A Hr5   c           
         US;  a  [        S5      e[        U 5      nUR                  U 5      n U R                  UR                  :w  a5  U R                  UR
                  :w  a  UR                  XR                  5      n [        XX4U[        U 5      S9n	US:X  a8  XR                  U   :  a  [        S5      e[        X	USS9n
[        XX#XEU
5      n
U
$ [        X	XVUS9n
U
$ )	a9  Apply a Savitzky-Golay filter to an array.

This is a 1-D filter. If `x`  has dimension greater than 1, `axis`
determines the axis along which the filter is applied.

Parameters
----------
x : array_like
    The data to be filtered. If `x` is not a single or double precision
    floating point array, it will be converted to type ``numpy.float64``
    before filtering.
window_length : int
    The length of the filter window (i.e., the number of coefficients).
    If `mode` is 'interp', `window_length` must be less than or equal
    to the size of `x`.
polyorder : int
    The order of the polynomial used to fit the samples.
    `polyorder` must be less than `window_length`.
deriv : int, optional
    The order of the derivative to compute. This must be a
    nonnegative integer. The default is 0, which means to filter
    the data without differentiating.
delta : float, optional
    The spacing of the samples to which the filter will be applied.
    This is only used if deriv > 0. Default is 1.0.
axis : int, optional
    The axis of the array `x` along which the filter is to be applied.
    Default is -1.
mode : str, optional
    Must be 'mirror', 'constant', 'nearest', 'wrap' or 'interp'. This
    determines the type of extension to use for the padded signal to
    which the filter is applied.  When `mode` is 'constant', the padding
    value is given by `cval`.  See the Notes for more details on 'mirror',
    'constant', 'wrap', and 'nearest'.
    When the 'interp' mode is selected (the default), no extension
    is used.  Instead, a degree `polyorder` polynomial is fit to the
    last `window_length` values of the edges, and this polynomial is
    used to evaluate the last `window_length // 2` output values.
cval : scalar, optional
    Value to fill past the edges of the input if `mode` is 'constant'.
    Default is 0.0.

Returns
-------
y : ndarray, same shape as `x`
    The filtered data.

See Also
--------
savgol_coeffs

Notes
-----
Details on the `mode` options:

    'mirror':
        Repeats the values at the edges in reverse order. The value
        closest to the edge is not included.
    'nearest':
        The extension contains the nearest input value.
    'constant':
        The extension contains the value given by the `cval` argument.
    'wrap':
        The extension contains the values from the other end of the array.

For example, if the input is [1, 2, 3, 4, 5, 6, 7, 8], and
`window_length` is 7, the following shows the extended data for
the various `mode` options (assuming `cval` is 0)::

    mode       |   Ext   |         Input          |   Ext
    -----------+---------+------------------------+---------
    'mirror'   | 4  3  2 | 1  2  3  4  5  6  7  8 | 7  6  5
    'nearest'  | 1  1  1 | 1  2  3  4  5  6  7  8 | 8  8  8
    'constant' | 0  0  0 | 1  2  3  4  5  6  7  8 | 0  0  0
    'wrap'     | 6  7  8 | 1  2  3  4  5  6  7  8 | 1  2  3

.. versionadded:: 0.14.0

Examples
--------
>>> import numpy as np
>>> from scipy.signal import savgol_filter
>>> np.set_printoptions(precision=2)  # For compact display.
>>> x = np.array([2, 2, 5, 2, 1, 0, 1, 4, 9])

Filter with a window length of 5 and a degree 2 polynomial.  Use
the defaults for all other parameters.

>>> savgol_filter(x, 5, 2)
array([1.66, 3.17, 3.54, 2.86, 0.66, 0.17, 1.  , 4.  , 9.  ])

Note that the last five values in x are samples of a parabola, so
when mode='interp' (the default) is used with polyorder=2, the last
three values are unchanged. Compare that to, for example,
`mode='nearest'`:

>>> savgol_filter(x, 5, 2, mode='nearest')
array([1.74, 3.03, 3.54, 2.86, 0.66, 0.17, 1.  , 4.6 , 7.97])

)mirrorconstantnearestinterpwrapz@mode must be 'mirror', 'constant', 'nearest' 'wrap' or 'interp'.)r'   r(   r   r   ra   zOIf mode is 'interp', window_length must be less than or equal to the size of x.r_   )rH   mode)rH   rc   cval)r   r   r:   r   r   float32astyper4   r   r8   r   r\   )r.   r%   r&   r'   r(   rH   rc   rd   r   r-   r1   s              r3   savgol_filterrg      s    L FF / 0 	0 
	B


1Aww"**BJJ!6IIa$r)TU,F x774=( ? @ @ qt*=q5PQR
 H qtTBHr5   )r         ?Nr   )r   rh   r   ra   g        )scipy._lib._utilr   scipy._lib.array_api_compatr   r   scipy._lib._array_apir   r   r   scipy._lib.array_api_extra_libarray_api_extrar    scipy.ndimager   scipy.signalr	   r#   _arraytoolsr   r4   rD   rZ   r\   rg    r5   r3   <module>rs      s[    , : I I ( ( $ * # EIM$(M`43n" ?B/2Br5   