
    (ph0                         S SK r S SKrS SKJrJr  S SKJrJrJ	r	  S SK
Jr  S SKJr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 S r!g)    N)assert_equalassert_array_equal)assert_almost_equalassert_array_almost_equalxp_assert_close)
convolve1d)savgol_coeffssavgol_filter)_polyderc                 0    [        X5      n[        X25        g )N)r   r   )pmexpecteddps       Y/var/www/html/venv/lib/python3.13/site-packages/scipy/signal/tests/test_savitzky_golay.pycheck_polyderr      s    	!Br$    c                  ~   S/SS/4S/SS/4/ SQS/ SQ4/ SQSSS/4/ SQSS/4/ SQSS/4/ SQ/ SQ/S/ SQ/ SQ/4/ SQ/ SQ/SSS/S	S//4/ SQ/ SQ/SS/S	//4/ SQ/ SQ/SS/S//4/
n U  HO  u  pn[        [        R                  " U5      R                  U[        R                  " U5      R                  5        MQ     g )
N   r      )      r      r   r   )r   r      
   )r   nparrayT)casesr   r   r   s       r   test_polyderr       s    
a!
a!	Ay!	A1v	As	As
Y	Y	$:;
Y	aVb!W$56
Y	aS2$K0
Y	aS1#J/E  hbhhqkmmQ(:(<(<=  r   c                     Uc  U S-  n[         R                  " U 5      nX2:H  R                  [        5      n[         R                  " [         R
                  " X4U5      U5      nU$ )zThis is an alternative implementation of the SG coefficients.

It uses numpy.polyfit and numpy.polyval. The results should be
equivalent to those of savgol_coeffs(), but this implementation
is slower.

window_length should be odd.

r   )r   arangeastypeintpolyvalpolyfit)window_length	polyorderpostuniths         r   alt_sg_coeffsr-   +   sS     {q 
		- AHS!D


2::ay115AHr   c                      [        SS5      n [        U S/5        [        SS5      n [        U / SQSS9  [        S	S
5      n [        U / SQSS9  [        S	S
SS9n [        U / SQSS9  [        S	S
SSS9n [        U / SQSS9  g )Nr   r         ?r   r   )        r   r   绽|=atolr      )r0   r   r   r   r   r)   )r0   r   r   r   r   dotr)   use)r0   r   r   r   r   )r	   r   )r,   s    r   test_sg_coeffs_trivialr9   =   s    aAAuaAA{/aAA(u5a"AA(u5au-AA(u5r   c           
          S /[        [        U 5      5      -    H(  n[        XUSS9n[        XUS9n[	        X4SSXU4-  S9  M*     g )Nr6   r7   r5   r1   z(window_length = %d, order = %d, pos = %s)r3   err_msg)listranger	   r-   r   )r'   orderr)   h1h2s        r   compare_coeffs_to_altrA   O   sU     vU=122=SeD=S9U!K"/!<"=	? 3r   c                  f    [        SSS5       H   n [        U 5       H  n[        X5        M     M"     g )Nr      r   )r=   rA   )r'   r>   s     r   test_sg_coeffs_comparerD   [   s+    q!Q=)E!-7 * (r   c                     Sn SnUS-  n[         R                  " SSS5      nUS   US   -
  nSUS	-  -  U-
  n[        X5      n[        XV5      n[	        XrU*  XRU*  5        S
US-  -  S-
  n[        XSUS9n[        XV5      n	[	        XU*  XU*  5        SU-  n
[        XSUS9n[        XV5      n[	        XU*  XU*  5        g )Nr4   	   r   r      +   r         ?r   g      ?)derivdelta      @)r   linspacer	   r   r   )r(   r'   halflenxrK   yr,   y0dyy1d2yy2s               r   test_sg_coeffs_exactrV   b   s    IMq G
Ar2AaD1Q4KE
 	a1fqAm/A	A	BBx(!WH*=> 
qAv	BmauEA	A	BBx("gX*>? 'CmauEA	A	BBx(#wh*?@r   c            
         [         R                  " / SQ5      n U S-  S-  nU S-  n[         R                  " U S5      n[        UR                  5       H  n[        SSUSSS	9n[        UR                  U5      X   S
S9  [        SSUSSSS9n[        UR                  U5      X$   S
S9  [        SSUSSSS9n[        UR                  U5      X4   S
S9  M     g )N)g       r0          @      @g      @r   r4   rI   r   r   rX   r6   )r)   rK   r8   r1   r2   r   )r)   rK   r8   rJ   )r   r   	full_liker=   sizer	   r   r6   )irO   dxd2xr)   coeffs0coeffs1coeffs2s           r   test_sg_coeffs_derivrb      s     	+,A	Q
A	
QB
,,q#
CQVV}1#SeDAU;1#Se1MAe<1#Se1MAu= r   c                      [        SSSS9n [        U [        R                  " S5      5        [        SSSS9n [        U [        R                  " S5      5        g)	z
If deriv > polyorder, the coefficients should be all 0.
This is a regression test for a bug where, e.g.,
    savgol_coeffs(5, polyorder=1, deriv=2)
raised an error.
r   r   r   )r(   rJ   r   r4   r   N)r	   r   r   zeros)coeffss    r   !test_sg_coeffs_deriv_gt_polyorderrf      sD     13Fvrxx{+13Fvrxx{+r   c                  x    [        SS5      n [        X S S S2   5        [        SSSS9n[        XS S S2   * 5        g )N   rF   r   )rJ   )r	   r   )r_   r`   s     r   test_sg_coeffs_largerj      s@     B"Ggtt}5B+Gg"~6r   c                  :   / SQn U  H3  n[        USS5      n[        U[        R                  " U5      U-  5        M5     S nS nU  H  nUS-  n[	        U* S-   US-   5       Vs/ s H  nU" Xe5      PM     snS S S2   n[        USS5      n[        Xx5        [        USS5      n[        Xx5        [	        U* S-   US-   5       Vs/ s H  nU" Xe5      PM     snS S S2   n[        USS5      n[        Xx5        [        USS5      n[        Xx5        M     g s  snf s  snf )	N)r4   r   rC   r            r   c                 <    SU S-
  -  SU-  S-   U-  SU-  S-
  -  -  $ )Nr   rI   r   r    )kr   s     r   h_p_d_closed_form_1>test_sg_coeffs_even_window_length.<locals>.h_p_d_closed_form_1   s.    !c'{QqS1WaK1q122r   c                     SSUS-  -  S-   SU S-
  S-  -  -   -  nSSU-  S-   -  US-   -  U-  US-
  -  SU-  S-
  -  nX#-  $ )N   r   r   rl   rI   r4   rp   )rq   r   numerdenoms       r   h_p_d_closed_form_2>test_sg_coeffs_even_window_length.<locals>.h_p_d_closed_form_2   sf    Bq!tGaK"a#g\/121Q37QU#A%q1u-qsQw7{r   r   r   ri   r   )r	   r   r   	ones_liker=   )	window_lengthslengthh_p_drr   ry   r   rq   expected_outputactual_outputs	            r   !test_sg_coeffs_even_window_lengthr      s:   .N fa+r||E2V;< !3
 !AI$)1"q&!a%$8:$8q /q4$8::>B$@%fa37%fa37 %*1"q&!a%$8:$8q /q4$8::>B$@%fa37%fa37 !::s   #DDc                     [         R                  " S/5      n [        U SS5      n[        US/5        [         R                  " S/5      n [        U SSSS9n[	        US/SS	9  [         R                  " S/5      n [        U SSS
S9n[	        US/SS	9  [         R                  " S/S-  5      n [        U SSSS9n[	        U/ SQSS	9  g)z1Test some trivial edge cases for savgol_filter().r/   r   r   rL   r   constantmoderu   )decimalnearestwrap)r/   r/   r/   N)r   r   r
   r   r   rO   rP   s     r   test_sg_filter_trivialr      s    
#AaAASE
 	#AaAJ/AC5"-
#AaAI.AC5"-
#AaAF+A?B7r   c                      [         R                  " / SQ5      n [        U SSSS9n[        U/ SQ5        [        U SSSS9n[        U/ SQ5        [        U SSS	S9n[        U/ S
Q5        g )Nr/   rX   r/   r   r   r   r   r/   UUUUUU?r/   mirror)竪?r   r   r   )r   r   r   )r   r   r
   r   r   s     r   test_sg_filter_basicr      sa    
!AaAJ/AA*+aAH-AA23aAF+AA23r   c                      [         R                  " / SQ/ SQ/5      n [         R                  " / SQ/ SQ/5      n[        U SSSS9n[        X!5        [        U R                  SSSS	S
9n[        X!R                  5        g )Nr   )rX   rY   rX   r   )rX   gUUUUUU@rX   r   r   r   r   r   )r   axis)r   r   r
   r   r   )rO   r   rP   s      r   test_sg_filter_2dr      sm    
/!# 	$Axx,,. /HaAJ/AA acc1ajq9AAzz"r   c            
         [         R                  " SSS5      n U S   U S   -
  n[         R                  " U SU S-  -  U S-  U -
  /5      n[         R                  " [         R                  " U 5      SU -  SU S-  -  S	-
  /5      n[         R                  " [         R                  " U 5      [         R
                  " U S5      SU -  /5      nS
n[        X%SSSS9n[        XbSS9  [        X%SSSSUS9n[        XsSS9  [        X%SSSSUS9n[        XSS9  UR                  nUR                  nUR                  n[        X%SSSS9n[        XbSS9  [        X%SSSSUS9n[        XsSS9  [        X%SSSSUS9n[        XSS9  g )Nr   rG   r   r   r   r   r   r/   r   ri   interp)r   r   g-q=r2   r   r   rJ   rK   )	r   rM   r   r{   
zeros_likerZ   r
   r   r   )	r*   rK   rO   r]   r^   r'   rP   rS   rU   s	            r   test_sg_filter_interp_edgesr      s   
 	B2AaD1Q4KE
!a1f*q&1* 	A 
2<<?q5qAv:#% 
&B ((BMM!$LLA&E C MaBAAu%	q(e
-BB'	q(e
-BB%( 	
A	B
%%CaAAAu%	qe
-BB'	qe
-BB%(r   c            
         [         R                  " SSS5      n U S   U S   -
  n[         R                  " X * /5      n[         R                  " U S-  SU S-  -  S-   /5      n[         R                  " U S-  SU S-  -  U S-  -   SU -  -
  /5      n[         R                  " [         R                  " U 5      [         R                  " U 5      * /5      n[         R                  " SU -  S	U -  /5      n[         R                  " SU S-  -  S	U S-  -  SU -  -   S-
  /5      n[         R                  " X#U/5      n[         R                  " XVU/5      n	[	        US
SSSUS9n
[        XSS9  [	        US
SSSSUS9n[        XSS9  [         R                  " UR                  UR                  UR                  /5      n[         R                  " UR                  UR                  UR                  /5      n	[	        US
SSSUS9n
[        XSS9  [	        US
SSSSUS9n[        XSS9  UR                  SS5      R                  5       nU	R                  SS5      R                  5       n	[	        US
SSSUS9n
[        XSS9  [	        US
SSSSUS9n[        XSS9  g )Nr   r   rG   r   r   r   r   rI   r   r   ri   r   )r   r   rK   r1   r2   r   )	r   rM   r   r{   r
   r   r   swapaxescopy)r*   rK   x1x2x3dx1dx2dx3zdzrP   rR   s               r   test_sg_filter_interp_edges_3dr   1  sT   
B2AaD1Q4KE	1b'	B	161qAv:>*	+B	161qAv:Q.q89	:B
((BLLObll1o%56
7C
((AE1q5>
"C
((AQJAF
QU 2S 89
:C 	""A	3S/	"BaABXUCAAu%	q!QRhau	MBB' 	"$$bdd#$A	355#%%'	(BaAAHEBAAu%	q!QQXQe	LBB' 	


1aA	Q				!BaAAHEBAAu%	q!QQXQe	LBB'r   c            	      `   [         R                  " S5      n [        U SSSS9  [        R                  " [
        SS9   [        U SSSS9  S	S	S	5        [        U S
SSSS9  [        R                  " [
        SS9   [        U SSSSS9  S	S	S	5        g	! , (       d  f       NK= f! , (       d  f       g	= f)z=Tests that the window_length check is using the correct axis.)r            r   r   )r'   r(   r   zwindow_length must be less than)matchrh   NrF   r   )r'   r(   r   r      )r   onesr
   pytestraises
ValueError)rO   s    r   %test_sg_filter_valid_window_length_3dr   [  s     	A!2B	z)J	KarQXF 
L !1I	z)J	KarQQXN 
L	K 
L	K 
L	Ks   B7B
B
B-)"r   numpyr   numpy.testingr   r   scipy._lib._array_apir   r   r   scipy.ndimager   scipy.signalr	   r
   scipy.signal._savitzky_golayr   r   r    r-   r9   rA   rD   rV   rb   rf   rj   r   r   r   r   r   r   r   rp   r   r   <module>r      s       % 5 1%
>*$6$	?8A:> 
,7 8N8,
4	#.)b'(TOr   