
    Bpja=                     
   S SK rS SKrS SKJr  S SKJr  S SKJrJ	r	J
r
JrJr  S SKJr  S rS r\R"                  R%                  SS	// S
Q5      S 5       r\R"                  R%                  SSS/5      \R"                  R%                  SSS/5      S 5       5       r\R"                  R%                  / SQ/ SQS-  /SSS\S4\R,                  " S5      SSS\S4\R.                  " S5      SSS\S4/ SQSSS\S4/ SQSSS\S 4/ SQSS S\S!4/ SQSSS S/\S"4/ SQSSS //\S"4SS\R2                  /SSS\S#4/ SQSSSS\R2                  /\S$4SS\R2                  /SS/ SQ\S%4/5      S& 5       rS' r\R"                  R%                  S	/ S(Q5      S) 5       r\R"                  R%                  S/ S*Q5      S+ 5       r\R"                  R%                  S,SS-/5      \R"                  R%                  S/ S*Q5      S. 5       5       rS/ rS0 r \R"                  R%                  S1\R2                  \RB                  S2/5      S3 5       r"S4 r#\R"                  R%                  S/ SQ5      S5 5       r$\R"                  R%                  S,SS-/5      S6 5       r%g)7    N)assert_allclose)whittaker_henderson)_logdet_difference_matrix_polynomial_fit_reml_solveh_banded_solve_WH_banded)special_ortho_groupc                    U R                   S   nSU-  n[        R                  " U5      n[        R                  " U5      n[        R                  " U5      nSU-   nSU-  US'   SnXuS   -  US'   US   U-  U S   -  US'   UnUS:X  a  SU-   XS   -  -
  nSUS   -
  nOSU-   XS   -  -
  nSUS   -
  nSU-  US'   XuS   -  US'   US   XS   -  XS   -  -   -  US'   Un[        SUS-
  5       HX  n	SU-   XU	S-
     -  -
  XYS-
     -
  nSU-  XY'   SXIS-
     -
  nXuU	   -  XI'   XY   XU	   -  XU	S-
     -  -   X9S-
     -
  -  X9'   UnMZ     US:  aZ  US-
  n	SU-   XU	S-
     -  -
  XYS-
     -
  nSU-  XY'   SXIS-
     -
  nXuU	   -  XI'   XY   XU	   -  XU	S-
     -  -   X9S-
     -
  -  X9'   UnUS-
  n	SU-   XU	S-
     -  -
  XYS-
     -
  nSU-  XY'   XY   XU	   -  XU	S-
     -  -   X9S-
     -
  -  X9'   [        R                  " U5      n
X2S-
     XS-
  '   X2S-
     XBS-
     XS-
     -  -   XS-
  '   [        US-
  SS5       H#  n	X9   XI   XS-      -  -   XY   XS-      -  -
  X'   M%     U
$ )	a  Efficiently solve WH of order 2 according to Weinert.

Needs order = 2 and n >= 3 (data points).

Weinert (2007)
"Efficient computation for Whittaker-Henderson smoothing".
Computational Statistics and Data Analysis 52:959-74.
https://doi.org/10.1016/j.csda.2006.11.038
r                     )shapenpemptyrange)ylambnbefdmumu_oldixs              ]/var/www/html/pdf-tiff/venv/lib/python3.13/site-packages/scipy/signal/tests/test_whittaker.py_solve_WH_order2_fastr#      s-    	

A t8D 	A
A
A	DAq5AaD	
B!9AaDQ4$;1AaDFAvHv!}$1XHv!}$1Xq5AaD!9AaDQ44A$;A$./AaDF1ac]Hv!A#&Q3/1uQ3ZaDyttd{V!f_4q1v=>  	AvEHv!A#&Q3/1uQ3ZaDyttd{V!f_4q1v=>	AA	D6acF?"QsV+Aq5AD44A$;AaC&01qS69:AD 	AsVAcFsVa!fq1vo%AcF1Q3BtadQsVm#adQsVm3  H    c                  ,   Sn [        U SS9R                  5       nU[        R                  " S[        R                  " U 5      -   5      -  UR
                  -  n[        R                  " U 5      n[        R                  " X 45      n[        R                  " US5      USS S 24'   [        SU 5       H   n[        R                  " X%5      XES U* 24'   M"     [        XCSS9u  pgn[        U[        R                  R                  X#5      SS	9  [        U[        R                  " [        R                  R                  U5      5      SS	9  [        US S
 USS9u  pgn[        R                  " [        R                  " U5      5      [        R                  " [        R                  " US5      S5      -   [        R                  " [        R                  " US5      S5      -   n	[        U[        R                  " [        R                  R                  U	5      5      SS	9  g )N
   i  )seedr   r   Tcalc_logdetdy=rtolr   r   )r
   rvsr   diagarangeTzerosdiagonalr   r   r   linalgsolvelogdet)
r   QAr   abr    r!   logdet_A_tris
             r"   test_solveh_bandedr=   V   s{   
AAD)--/A	BGGA		!$%%+A
		!A	1&	B{{1a Bq!tH1a[[[&crc6
 !"T:LAqAryyq,59FBFF299==#345A ""Ra&!>LAq

bggbgganb99BGGBGGAqMST<UU 
 FBFF299==#78uEr$   orderr   ))r   r   )r   r&   )r   r   )r   r   )r   r   )r      )r   r   )r      )r   r&   )r   r?   )r   r@   )r   r&   )r   r?   c           
         U n[        X!S9n[        R                  " [        R                  " U5      USS9n[	        U[        R
                  " [        R                  R                  XDR                  -  5      5      SS9  [        R                  R                  UR                  U-  5      n[	        U[        R                  " [        R
                  " XUS:     5      5      SS9  g )N)r>   r   r   r   axisr*   r+   g:0yE>)r   r   diffeyer   r5   r3   r6   r0   eigvalssum)r>   r   pr:   DrF   s         r"   test_logdet_difference_matrixrJ   l   s     	A&Q4F
q	QQ'AFBFF299==SS#9:Giia(GFBFF266'D.*A#BC%Pr$   r)   FTr   g?@xDc                 R   Sn[         R                  " S[         R                  -  [         R                  " SSU5      -  5      n[	        X1U S9u  pEU (       d  US:X  d   e[	        X1S[         R
                  " U5      -  U S9u  pgU[        R                  " USS	9:X  d   e[        Xd5        g
)z,Test that _polynomial_fit works as expected.r?   r   r   r   r(   Gz?)weightsr)   g-q=relN)	r   sinpilinspacer   onespytestapproxr   )r)   r   r   r   polyr:   poly2logdet2s           r"   test_polynomial_fitrZ   }   s     	A
q255y2;;q!Q//0A"1DLD{{$	
*NE fmmF6666E r$   signalr   r>   rN   errmsg)r   r   r   r   r   r   z*Input array signal must be of shape \(n,\)z,Input array signal must be at least of shaper&   gzParameter lamb must be stringXXXz$Parameter lamb must be string 'reml'g      ?zorder must be an integer.z(order must be an integer not less than 1zAInput array weights must have the same shape as the signal array.z"Input array signal must be finite.z#Input array weights must be finite.z3Input array weights must be zero for all non-finitec                 t    [         R                  " XES9   [        XX#S9  SSS5        g! , (       d  f       g= f)z"Test that whittaker raises errors.matchr   r>   rN   N)rU   raisesr   r[   s         r"   test_whittaker_raisesre      s&    8 
s	&FUL 
'	&	&s   )
7c                  f   Sn [         R                  " S5      n[        USU S9n[         R                  " SU -   U /U SU -   //5      SSU -  -   -  U-  n[	        UR
                  USS9  [        [         R                  " S5      SU S9  [         R                  " S5      n[        USU S9n[         R                  " SSU -  -   SU -  U * /SU -  SSU -  -   SU -  /U * SU -  SSU -  -   //5      SSU -  -   -  U-  n[	        UR
                  USS9  UR                  U :X  d   e[         R                  " S	5      n[        USU S9nU S-  n[         R                  " S
U-  SU -  -   S-   SU-  SU -  -   SU-  U -
  SU-  /SU-  SU -  -   SU-  SU -  -   S-   S	U-  S	U -  -   SU-  U -
  /SU-  U -
  S	U-  S	U -  -   SU-  SU -  -   S-   SU-  SU -  -   /SU-  SU-  U -
  SU-  SU -  -   S
U-  SU -  -   S-   //5      SU-  SU -  -   S-   -  U-  n[	        UR
                  USS9  [        [         R                  " S5      SU S9  [        [         R                  " S	5      SU S9  [        [         R                  " S5      SU S9  [        [         R                  " S5      SU S9  [        [         R                  " S5      SU S9  g)z/Test that whittaker works on a few data points.r   r   )r>   r   gV瞯<)atolr   r   r   r            r@   r?      N)r   r/   r   arrayr   r!   r   )lar   whresla2s        r"   test_whittaker_small_datarr      s    
B
		!A	Qab	1B88a"fb\BB<01QRZ@A
ECBDD#E*		!AB7
		!A	Qab	1B 	RZQVRC0RQVR0CQVQRZ0
 	 !b&j		 C BDD#E*77b==
		!A	Qab	1B
'C
((	C"R%!	QsUQrT\qu|CT
C%1R4-QsUQrT\A-quqt|!C%2+T
C%R-QsUQrT\quqt|a/?!C%!B$,T	CQsUr\quqt|C"R%RSAST	 
 
C"R%!	
 !"
"C BDD#E*		!AB7		!AB7		!AB7		!AB7		!AB7r$   )r   r   r   d   c                 h   [         R                  R                  S5      n[         R                  " S[         R                  -  [         R
                  " SSU 5      -  5      UR                  U 5      -   n[        USSS9u  p4[        USS9n[        X5SS	9  [        USSS9n[        UR                  USS	9  g
)zTest equivalent results*   r   r   r   rM   r   r>   r   r*   r+   N)r   randomdefault_rngrQ   rR   rS   standard_normalr	   r#   r   r   r!   )r   rngr\   x1r;   x2ro   s          r"   $test_whittaker_direct_vs_fast_order2r~      s     ))


#CVVAIAq! 4458K8KA8NNFV$a8EB	vD	1BB'	V$a	8BBDD"5)r$   )r   r   r   r   c                 V   [         R                  R                  S5      nSn[         R                  " S[         R                  -  [         R
                  " SSU5      -  5      nUR                  U5      nX4-   n[        USU S9n[        UR                  USS	S
9  UR                  S:X  d   eg)z.Test whittaker for penalty lamb close to zero.ru   rs   r   r   r   Hz>rv   g-C6?h㈵>r,   rg   N)r   rx   ry   rQ   rR   rS   rz   r   r   r!   r   )r>   r{   r   r   noiser\   ro   s          r"   !test_whittaker_limit_zero_penaltyr      s     ))


#CA
qwQ1--.A"EYF 
V$e	<BBDD&t$777d??r$   rN   rT   c                    Sn[         R                  " S[         R                  -  [         R                  " SSU5      -  5      nU c  SO[         R                  " U5      n[        USXS9n[         R                  " [        U5      5      n[         R                  R                  R                  XcUS-
  S9n[        UR                  U" U5      S	S
U-   -  SS9  US:X  a)  [         R                  " UR                  5      S   S:  d   eUS:  a.  [        R                  " [         SS9   [        USXS9nSSS5        O[        USXS9n[        UR                  U" U5      SS9  g! , (       d  f       N*= f)z2Test whittaker for penalty lamb close to infinity.rs   r   r   r   Ng   vH7Brc   r!   r   degr&   ir   r   z;The linear solver in Whittaker-Henderson smoothing detectedra   g  4&kCrK   g|=r+   )r   rQ   rR   rS   	ones_liker   r/   len
polynomial
Polynomialfitr   r!   rD   rU   warnsUserWarning)rN   r>   r   r   wro   x_polyrW   s           r"   %test_whittaker_limit_infinity_penaltyr      s4    	A
qwQ1--.AR\\!_A 
QT	BBYYs1vF==##''&519'EDBDD$v,R"u*-=DIz wwrtt}Q!###qy \\O
 %QTJB	
 
 !UFBDD$v,U3
 
s   #E
E-c                     Sn [         R                  " S[         R                  -  [         R                  " SSU 5      -  5      n[	        USS9n[        UR                  USS9  [         R                  " UR                  U5      (       a   eg)	zTest whittaker for lamb=0.r&   r   r   r   rw   r*   r+   N)r   rQ   rR   rS   r   r   r!   may_share_memory)r   r   ro   s      r"   test_whittaker_unpenalizedr     sk    
A
qwQ1--.A	QQ	'BBDD!%(""244+++++r$   c                     [         R                  R                  S5      n Sn[         R                  " S[         R                  -  [         R
                  " SSU5      -  5      nU R                  U5      nX#-   n[        USS9n[         R                  " U5      n[        USUS9n[        UR                  UR                  SS	9  [        US
S
U-  S9n[        UR                  UR                  SS	9  g)zATest that whittaker with weights of 1 is same as without weights.ru   rs   r   r   r   rw   )r   rN   r*   r+   r   N)r   rx   ry   rQ   rR   rS   rz   r   r   r   r!   )	r{   r   r   r   r\   wh1r   wh2wh3s	            r"   test_whittaker_weightsr   %  s    
))


#CA
qwQ1--.A"EYF
f1
-C
VA
f1a
8CCEE355u- f1ac
:CCEE355u-r$   missing_valueg#B;c           	         Sn[         R                  " S[         R                  -  [         R                  " SSU5      -  5      nUSS=== S-  sss& [         R                  " U5      nXSS& SUSS& [        USSUS	9n[         R                  " [         R                  " SS5      S
S/UR                  S
   UR                  S   /5      n[        UR                  SS USS9  [        USSUS	9n[         R                  R                  R                  / SQUR                  S   UR                  S
   UR                  S   UR                  S   /SS9n[        UR                  SS U" [         R                  " SS5      5      SS9  g)z8Test that whittaker interpolates where weights are zero.rs   r   r   r   2   N(   <   rc   '   r*   r+   )&   r   r   =   r   r   r   r   )r   rQ   rR   rS   r   r   interpr/   r!   r   r   r   r   )r   r   r\   r   ro   r   rW   s          r"   (test_whittaker_zero_weight_interpolationr   6  sJ    	AVVAbeeGbkk!Q223F
23K1K
VA!2bMAbH 
V!1a	@BYYryyR(2r(RTT"XrttBx4HIFBDDBKe4 
V!1a	@B==##''
rttBxb2448RTT"XFA ( D BDDBKbiiB&7!8uEr$   c            	      >   Sn [         R                  " S[         R                  -  [         R                  " SSU 5      -  5      nUSS=== S-  sss& [         R                  " U5      n[         R
                  USS& SUSS& [        USSUS9n[        UR                  SS UR                  S	   S
S9  [        USSUS9n[         R                  R                  R                  SS	/UR                  SS SS9n[        UR                  SS U" [         R                  " SS5      5      S
S9  [        USSUS9n[         R                  R                  R                  / SQUR                  SS SS9n[        UR                  SS U" [         R                  " SS5      5      SS9  g)z8Test that whittaker extrapolates where weights are zero.rs   r   r   r   r   NP   rc   O   r*   r+   N   r   r   )M   r   r   r   g&.>)r   rQ   rR   rS   r   nanr   r   r!   r   r   r   r/   )r   r\   r   ro   rW   s        r"   (test_whittaker_zero_weight_extrapolationr   N  sa   AVVAbeeGbkk!Q223F
23K1K
VA&&F23KAbcF 
V!1a	@BBDDIrttBxe4 
V!1a	@B==##''2r(bdd2bkq'IDBDDItBIIb#$67eD 
V!1a	@B==##'',"$$r"+1'MDBDDItBIIb#$67dCr$   c                 L  ^ ^^^ SnSm[         R                  " S[         R                  -  [         R                  " SST5      -  5      n[         R                  " [         R
                  " T5      T SS9mTR                  T-  mUUUU 4S jn[        XT S9nU" XS	9n[        XES
S9  g )Ngn?r&   r   r   r   rB   c                   > [         R                  " T5      U T-  -   n[         R                  R                  X!5      nX-
  nXD-  X-  T-  U-  -   nSTT	-
  S[         R                  " UTT	-
  -  5      -   -  [         R                  " [         R                  R                  U T-  TR                  -  5      5      -
  [         R                  " [         R                  R                  U5      5      -   -  $ )Ng      r   )r   rE   r3   r4   r5   r6   r0   )
rn   r   r8   r!   residr2rI   Mr   r>   s
         r"   	test_reml&test_reml_criterion.<locals>.test_remlo  s    FF1IQIIOOA!]RVaZ!^+%ArQY/?(@$@A		b1fqssl ;<=		a 012 3 	3r$   )r   r   r>   )rn   r   r*   r+   )	r   rQ   rR   rS   rD   rE   r0   r   r   )	r>   rn   r   r   r1r   rI   r   r   s	   `     @@@r"   test_reml_criterionr   g  s    	B
A
qwQ1--.A
q	U+A	aA3 3 
B5	)B	b	BB'r$   c           	         SnSn[         R                  " S[         R                  -  [         R                  " SSU5      -  5      nUR	                  5       nUSSS2==   S-  ss'   USSS2==   S-  ss'   U c  SO[         R
                  " U5      n[        USX%S9nUR                  S:  d   e/ S	Qn[        UR                  US
S9  SnUS-  nUR                  [        R                  " US
S9:X  d   e[        USUS[         R
                  " U5      -  S9n	U	R                  [        R                  " SUR                  -  S
S9:X  d   eg)z.Test that whittaker with REML criterion works.r&   r   r   r   Ng?remlrc   )
gD?gM~{@?get'?gs-ׇ?g7틚]?g7틚]ֿgs-ׇget'gM~{@gDʿr   r+   g@$@   rO   )r   rQ   rR   rS   copyr   r   r   r   r!   rU   rV   )
rN   r   r>   r\   r   r   ro   expectedexpected_spr   s
             r"   test_whittaker_remlr   ~  s     	AEVVAbeeGbkk!Q223FAccFcMFaddGsNGR\\!_A	QV5	DB77Q;;"H
 BDD(.K2K77fmmKT:::: afE1r||TUCV
WC88v}}Q[d;;;;r$   )&numpyr   rU   numpy.testingr   scipy.signalr   scipy.signal._whittakerr   r   r   r   r	   scipy.statsr
   r#   r=   markparametrizerJ   rZ   
ValueErrorr1   r/   	TypeErrorr   re   rr   r~   r   r   r   r   infr   r   r   r    r$   r"   <module>r      s     ) ,  ,HVF, 	#	
QQ 6#t-! . 7!  <!m_aD*;=XXa[!Qj;=YYr]D!T:,.q$
353i(*1dJ791q!fjPR1seZPRBFF^Q4131q!RVVnj24BFF^Q9jBD+	
4M54M-8` n-	* .	* ,/ 0 T6N3,/4 0 44>,." 2662665*ABF CF.D2 ),( -(, T6N3*< 4*<r$   