
    doi7                        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S
 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/land-ocr/venv/lib/python3.13/site-packages/scipy/signal/tests/test_savitzky_golay.pycheck_polyderr      s    	!2	BB!    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 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_coeffsr4   7   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      )r9   r   r   r   r   r0   r   )r9   r   r   r   r   dotr0   user   )r9   r   r   r   r   )r
   r   r    float64)r   r3   s     r   test_sg_coeffs_trivialrC   I   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?   r@   r>   g|=zwindow_length = z
, order = z, pos = )r<   err_msg)listranger
   r4   r   )r.   orderr   r0   h1h2s         r   compare_coeffs_to_altrK   \   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   )rG   rK   )r   r.   rH   s      r   test_sg_coeffs_comparerN   i   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   r/   r.   halflenxrU   yr3   y0dyy1d2yy2s                r   test_sg_coeffs_exactr`   q   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       r9          @      @g      @r7   r   r=   rS   r   r   r   rb   r?   )r0   rU   rA   r   r:   r;   r   )r0   rU   rA   rT   r   )r    rB   	full_likerG   shaper
   r   )	r   irY   dxd2xr0   coeffs0coeffs1coeffs2s	            r   test_sg_coeffs_derivrl      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   )r/   rT   r   r7   r   r=   r   N)r
   r   zerosrB   )r   coeffss     r   !test_sg_coeffs_deriv_gt_polyorderrp      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   rP   r   gMb@?gTqs*>r;   r   )rT   r   g~jt?)r
   r   flipr   )r   ri   rj   s      r   test_sg_coeffs_largeru      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   rM   r            r   r   c                 <    SU S-
  -  SU-  S-   U-  SU-  S-
  -  -  $ )Nr   rS   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   rw   rS   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   r7   r   )r
   r   	ones_likerG   r    rB   )
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().r6   r   r   rV   r   constantmodeg [n<r;   nearestwrap)r6   r6   r6   N)r    r   r   r   r   rY   rZ   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r6   rb   r6   r   r   r   r   r6   UUUUUU?r6   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   )rb   rc   rb   r   )rb   gUUUUUU@rb   r   r   r   r   r   )r   axis)r    r   r   r"   )r   rY   r   rZ   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   rQ   r7   r   r   r   r   r   r6   r   r   interp)r   r   g-q=r;   r   r   rT   rU   )	rW   rB   stackr   
zeros_likerd   r   r   r"   )
r   r1   rU   rY   rg   rh   r.   rZ   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   rQ   r   r   r   r   rS   r   r   r   r   )r   r   rU   r:   r;   r   r   T)copy)rW   r   r   r   r   r"   r    r   )r   r1   rU   x1x2x3dx1dx2dx3zdzrZ   r\   s                r   test_sg_filter_interp_edges_3dr   Q  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.   r/   r   zwindow_length must be less than)matchrs   NrP   r   )r.   r/   r   r      )onesr   pytestraises
ValueError)r   rY   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   r&   r4   rC   rK   rN   r`   rl   rp   ru   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   