
    Bpj7                        S SK r S SKrS SKJrJrJrJrJrJ	r	  S SK
Jr  S SKJrJr  S SKJr  \ R"                  R$                  r\ R"                  R&                  r\ R"                  R%                  SSS9rS	 r\ R"                  R-                  S
SS9S 5       rS r\" \5      S 5       rS r\" \5      S 5       r\" \5      S 5       r\" \5      S 5       r\" \5      S 5       r\" SSS9\" \5      S 5       5       r\" \5      S 5       r \" \5      S 5       r!\" \5      S 5       r"\" \5      S 5       r#\" \5      S 5       r$\" \5      S 5       r%\" \5      S 5       r&g)    N)xp_assert_closexp_assert_equalxp_swapaxesis_torchmake_xp_test_case_xp_copy_to_numpy)
convolve1d)savgol_coeffssavgol_filter)_polyderz
dask.arrayzlinalg.lstsq is missing rcond)reasonc                 .    [        XUS9n[        XB5        g )Nxp)r   r   )pmexpectedr   dps        b/var/www/html/pdf-tiff/venv/lib/python3.13/site-packages/scipy/signal/tests/test_savitzky_golay.pycheck_polyderr      s    	!2	BB!    Fprivatec                    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 Hn  u  p#nU R                  U5      nU R                  U5      n[        UR                  S:X  a  UR                  OUUUR                  S:X  a  UR                  OUU 5        Mp     g )
N   r      )      r      r   r   )r   r      
   )asarrayr   ndimT)r   casesr   r   r   ppees          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ZZ]ZZ!GGqLBDDbGGaKBDDR		
  r   c                     Uc  U S-  n[         R                  " U 5      nXB:H  R                  [        5      n[         R                  " [         R
                  " XEU5      U5      nUR                  U5      $ )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   )nparangeastypeintpolyvalpolyfitr!   )window_length	polyorderposr   tuniths          r   alt_sg_coeffsr5   8   s\     {q 
		- AHS!D


2::ay115A::a=r   c                    [        SSU S9n[        XR                  S/U R                  S95        [        SSU S9n[        XR                  / SQU R                  S9S	S
9  [        SSU S9n[        XR                  / SQU R                  S9S	S
9  [        SSSU S9n[        XR                  / SQU R                  S9S	S
9  [        SSSSU S9n[        XR                  / SQU R                  S9S	S
9  g )Nr   r   r         ?dtyper   r   )        r   r   绽|=atolr      )r:   r   r   r   r   r1   r   )r:   r   r   r   r   dotr1   user   )r:   r   r   r   r   )r
   r   r!   float64)r   r4   s     r   test_sg_coeffs_trivialrD   J   s     	ar"AAzz3%rzzz:;ar"AAzz+RZZz@uMar"AAzz"32::zFUSab)AAzz"32::zFUSau4AAzz"32::zFUSr   c                     S /[        [        U 5      5      -    H-  n[        XUSUS9n[        XX2S9n[	        XESSU  SU SU 3S9  M/     g )	Nr@   rA   r?   g|=zwindow_length = z
, order = z, pos = )r=   err_msg)listranger
   r5   r   )r/   orderr   r1   h1h2s         r   compare_coeffs_to_altrL   ]   s^     vU=122=SeK=S@&}oZwhseT	
 3r   c                 d    [        SSS5       H  n[        U5       H  n[        XU S9  M     M!     g )Nr      r   r   )rH   rL   )r   r/   rI   s      r   test_sg_coeffs_comparerO   j   s/     q!Q=)E!-2> * (r   c                 B   SnSnUS-  nU R                  SSS5      nUS   US   -
  nSUS	-  -  U-
  n[        X!U S
9nU R                  [        [	        U5      [	        U5      5      5      n[        XU*  XcU*  5        SUS-  -  S-
  n	[        X!SXPS9nU R                  [        [	        U5      [	        U5      5      5      n
[        XU*  XU*  5        SU-  n[        X!SXPS9nU R                  [        [	        U5      [	        U5      5      5      n[        XU*  XU*  5        g )Nr>   	   r   r      +   r         ?r   r   g      ?)derivdeltar         @)linspacer
   r!   r	   r   r   )r   r0   r/   halflenxrV   yr4   y0dyy1d2yy2s                r   test_sg_coeffs_exactra   r   s?   IMq G
Ar2AaD1Q4KE
 	a1fqAm26A	J035Fq5IJ	KBBx(!WH*=> 
qAv	BmauLA	J035Fq5IJ	KBBx("gX*>? 'CmauLA	J035Fq5IJ	KBBx(#wh*?@r   c                 j   U R                  / SQU R                  S9nUS-  S-  nUS-  nU R                  US5      n[        UR                  S   5       H\  n[        SSUS	S
U S9n[        Xb-  X%   SS9  [        SSUS	S
SU S9n[        Xr-  X5   SS9  [        SSUS	S
SU S9n[        X-  XE   SS9  M^     g )N)g       r:          @      @g      @r8   r   r>   rT   r   r   r   rc   r@   )r1   rV   rB   r   r;   r<   r   )r1   rV   rB   rU   r   )r!   rC   	full_likerH   shaper
   r   )	r   irZ   dxd2xr1   coeffs0coeffs1coeffs2s	            r   test_sg_coeffs_derivrm      s     	

-RZZ
@A	Q
A	
QB
,,q#
CQWWQZ 1#SeKQV%81#Se1QSTRW591#Se1QSTchU; !r   c                     [        SSSU S9n[        XR                  SU R                  S95        [        SSSU S9n[        XR                  SU R                  S9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   )r0   rU   r   r8   r   r>   r   N)r
   r   zerosrC   )r   coeffss     r   !test_sg_coeffs_deriv_gt_polyorderrq      sV     1r:FFHHQbjjH9:1r:FFHHQbjjH9:r   torchz4torch loses precision (worse with f32 default dtype)c                     [        SSU S9n[        XR                  U5      [        U 5      (       a  SOSS9  [        SSSU S9n[        X R                  U5      * [        U 5      (       a  S	OSS9  g )
N   rQ   r   gMb@?gTqs*>r<   r   )rU   r   g~jt?)r
   r   flipr   )r   rj   rk   s      r   test_sg_coeffs_largerv      sg     Bb)G!& Br2G'''""8B<<Vr   c                    / SQnU H,  n[        USSU S9n[        X0R                  U5      U-  5        M.     S nS nU H  nUS-  n[        U* S-   US-   5       Vs/ s H  nU" Xv5      PM     snS S S2   nU R	                  XR
                  S	9n[        USSU S9n	[        X5        [        USSU S9n	[        X5        [        U* S-   US-   5       Vs/ s H  nU" Xv5      PM     snS S S2   nU R	                  XR
                  S	9n[        USSU S9n	[        X5        [        US
SU S9n	[        X5        M     g s  snf s  snf )N)r>   r   rN   r             r   r   c                 <    SU S-
  -  SU-  S-   U-  SU-  S-
  -  -  $ )Nr   rT   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   rx   rT   r>   r|   )r}   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   r8   r   )r
   r   	ones_likerH   r!   rC   )
r   window_lengthslengthh_p_dr~   r   r   r}   expected_outputactual_outputs
             r   !test_sg_coeffs_even_window_lengthr      sl    /N far2||E2V;< !3
 !AI$)1"q&!a%$8:$8q /q4$8::>B$@**_JJ*G%far:7%far:7 %*1"q&!a%$8:$8q /q4$8::>B$@**_JJ*G%far:7%far:7! !::s   D:D?c                    U R                  S/5      n[        USS5      n[        X R                  S/5      5        U R                  S/5      n[        USSSS9n[        X R                  S/5      SS	9  U R                  S/5      n[        USSS
S9n[        X R                  S/5      SS	9  U R                  S/S-  5      n[        USSSS9n[        X R                  / SQ5      SS	9  g)z1Test some trivial edge cases for savgol_filter().r7   r   r   rW   r   constantmodeg [n<r<   nearestwrap)r7   r7   r7   N)r!   r   r   r   r   rZ   r[   s      r   test_sg_filter_trivialr      s     	

C5AaAAAzz3%()
 	

C5AaAJ/AAzz3%(w7


C5AaAI.AAzz3%(w7


C519AaAF+AAzz/2Ar   c                    U R                  / SQ5      n[        USSSS9n[        X R                  / SQ5      5        [        USSSS9n[        X R                  / SQ5      5        [        USSS	S9n[        X R                  / S
Q5      5        g )Nr7   rc   r7   r   r   r   r   r7   UUUUUU?r7   mirror)竪?r   r   r   )r   r   r   )r!   r   r   r   s      r   test_sg_filter_basicr     sx     	

?#AaAJ/AAzz"567aAH-AAzz"=>?aAF+AAzz"=>?r   c                     U R                  / SQ/ SQ/5      nU R                  / SQ/ SQ/5      n[        USSSS9n[        X25        [        UR                  SSSS	S
9n[        X2R                  5        g )Nr   )rc   rd   rc   r   )rc   gUUUUUU@rc   r   r   r   r   r   )r   axis)r!   r   r   r#   )r   rZ   r   r[   s       r   test_sg_filter_2dr     sm    


O#% 	&Azz..0 1HaAJ/AA acc1ajq9AAzz"r   c           
         U R                  SSSU R                  S9nUS   US   -
  nU R                  USUS-  -  US-  U-
  /5      nU R                  U R                  U5      S	U-  SUS-  -  S
-
  /5      nU R                  U R	                  U5      U R                  US	5      S	U-  /5      nSn[        X6SSSS9n[        XsSS9  [        X6SSSSUS9n[        XSS9  [        X6SSSSUS9n	[        XSS9  UR                  nUR                  nUR                  n[        X6SSSS9n[        XsSS9  [        X6SSSSUS9n[        XSS9  [        X6SSSSUS9n	[        XSS9  g )Nr   rR   r8   r   r   r   r   r   r7   r   r   interp)r   r   g-q=r<   r   r   rU   rV   )	rX   rC   stackr   
zeros_likere   r   r   r#   )
r   r2   rV   rZ   rh   ri   r/   r[   r^   r`   s
             r   test_sg_filter_interp_edgesr      s    	B2RZZ0A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           
      |   U R                  SSS5      nUS   US   -
  nU R                  X* /5      nU R                  US-  SUS-  -  S-   /5      nU R                  US-  SUS-  -  US-  -   SU-  -
  /5      nU R                  U R                  U5      U R                  U5      * /5      nU R                  SU-  S	U-  /5      nU R                  SUS-  -  S	US-  -  SU-  -   S-
  /5      nU R                  X4U/5      n	U R                  XgU/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                  UR
                  UR
                  UR
                  /5      n	U 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                  [        U	SSU S9SS9n	U R                  [        U
SSU S9SS9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   rR   r   r   r   r   rT   r   r   r   r   )r   r   rV   r;   r<   r   r   T)copy)rX   r   r   r   r   r#   r!   r   )r   r2   rV   x1x2x3dx1dx2dx3zdzr[   r]   s                r   test_sg_filter_interp_edges_3dr   R  s^    	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' 	

;q!Q2.T
:A	KAqR0t	<BaAAHEBAAu%	q!QQXQe	LBB'r   c           	      V   U 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/   r0   r   zwindow_length must be less than)matchrt   NrQ   r   )r/   r0   r   r      )onesr   pytestraises
ValueError)r   rZ   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	2B	
B
B()'r   numpyr)   scipy._lib._array_apir   r   r   r   r   r   scipy.ndimager	   scipy.signalr
   r   scipy.signal._savitzky_golayr   markskip_xp_backendsxfail_xp_backends
pytestmarkr   uses_xp_capabilitiesr'   r5   rD   rL   rO   ra   rm   rq   rv   r   r   r   r   r   r   r   r|   r   r   <module>r      s     
 % 5 1;;// KK11 [[))8 * 

"
 !!%	!:
 ;
8$ =!T "T$

 =!? "? =!A "A: =!< "<  =!
; "
; J =! "$ =!"8 ""8P =!B "B, =!
@ "
@ =!	# "	# =!.) ".)b =!'( "'(T =!O "Or   