+
    nDja=                        ^ RI t^ RIt^ RIHt ^ RIHt ^ RIHtH	t	H
t
HtHt ^ RIHt R tR t]P"                  P%                  RR	.. R-O4      R
 4       t]P"                  P%                  RRR.4      ]P"                  P%                  RRR.4      R 4       4       t]P"                  P%                  . R.O. R/O^,          .^^R]R3]P,                  ! ^4      ^^R]R3]P.                  ! ^
4      R0^R]R3. R/OR^R]R3. R/O^RR]R3. R/O^^ R]R3. R/O^^^ ^.]R3. R/O^^^ ..]R3^^]P2                  .^^R]R3. R/O^^^^]P2                  .]R3^^]P2                  .^^. R/O]R3.4      R 4       tR  t]P"                  P%                  R	. R1O4      R! 4       t]P"                  P%                  R. R2O4      R" 4       t]P"                  P%                  RRR#.4      ]P"                  P%                  R. R2O4      R$ 4       4       tR% tR& t ]P"                  P%                  R']P2                  ]PB                  R(.4      R) 4       t"R* t#]P"                  P%                  R. R/O4      R+ 4       t$]P"                  P%                  RRR#.4      R, 4       t%R# )3    N)assert_allclose)whittaker_henderson)_logdet_difference_matrix_polynomial_fit_reml_solveh_banded_solve_WH_banded)special_ortho_groupc                   V P                   ^ ,          p^V,          p\        P                  ! V4      p\        P                  ! V4      p\        P                  ! V4      p^V,           p^V,          V^ &   ^pWu^ ,          ,          V^ &   V^ ,          V,          V ^ ,          ,          V^ &   TpV^8X  d/   ^V,           W^ ,          ,          ,
          p^V^ ,          ,
          pM-^V,           W^ ,          ,          ,
          p^V^ ,          ,
          p^V,          V^&   Wu^,          ,          V^&   V^,          W^,          ,          W^ ,          ,          ,           ,          V^&   Tp\        ^V^,
          4       F  p	^V,           WV	^,
          ,          ,          ,
          WY^,
          ,          ,
          p^V,          WY&   ^WI^,
          ,          ,
          pWuV	,          ,          WI&   WY,          WV	,          ,          WV	^,
          ,          ,          ,           W9^,
          ,          ,
          ,          W9&   TpK  	  V^8  d   V^,
          p	^V,           WV	^,
          ,          ,          ,
          WY^,
          ,          ,
          p^V,          WY&   ^WI^,
          ,          ,
          pWuV	,          ,          WI&   WY,          WV	,          ,          WV	^,
          ,          ,          ,           W9^,
          ,          ,
          ,          W9&   TpV^,
          p	^V,           WV	^,
          ,          ,          ,
          WY^,
          ,          ,
          p^V,          WY&   WY,          WV	,          ,          WV	^,
          ,          ,          ,           W9^,
          ,          ,
          ,          W9&   \        P                  ! V4      p
W2^,
          ,          W^,
          &   W2^,
          ,          WB^,
          ,          W^,
          ,          ,          ,           W^,
          &   \        V^,
          RR4       FO  p	W9,          WI,          W^,           ,          ,          ,           WY,          W^,           ,          ,          ,
          W&   KQ  	  V
# )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
)shapenpemptyrange)ylambnbefdmumu_oldixs   &&         [/data/cameron/venvs/s3viz/lib/python3.14/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                  z   ^
p \        V RR7      P                  4       pV\        P                  ! ^\        P                  ! V 4      ,           4      ,          VP
                  ,          p\        P                  ! V 4      p\        P                  ! W 34      p\        P                  ! V^ 4      VR	&   \        ^V 4       F   p\        P                  ! W%4      WERV) 13&   K"  	  \        WCRR7      w  rgp\        V\        P                  P                  W#4      RR7       \        V\        P                  ! \        P                  P                  V4      4      RR7       \        VR,          VRR7      w  rgp\        P                  ! \        P                  ! V4      4      \        P                  ! \        P                  ! VR
4      R
4      ,           \        P                  ! \        P                  ! V^4      ^4      ,           p	\        V\        P                  ! \        P                  P                  V	4      4      RR7       R# )
   i  )seedNTcalc_logdetdy=rtol:N   N)r   :NNNr   )r
   rvsr   diagarangeTzerosdiagonalr   r   r   linalgsolvelogdet)
r   QAr   abr   r   logdet_A_tris
             r   test_solveh_bandedr8   V   su   
AAD)--/A	BGGA		!$%%+A
		!A	1&	B{{1a BtH1a[[[&crc6
 !"T:LAqAryyq,59FBFF299==#345A ""R&!>LAq

bggbgganb99BGGBGGAqMST<UU 
 FBFF299==#78uEr   orderr   c           
         T p\        W!R 7      p\        P                  ! \        P                  ! V4      V^ R7      p\	        V\        P
                  ! \        P                  P                  WDP                  ,          4      4      RR7       \        P                  P                  VP                  V,          4      p\	        V\        P                  ! \        P
                  ! WUR8  ,          4      4      RR7       R# ))r9   r   r   axisr$   r%   g:0yE>N)r   r   diffeyer   r0   r.   r1   r+   eigvalssum)r9   r   pr5   Dr?   s   &&    r   test_logdet_difference_matrixrC   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                   ^p\         P                  ! ^\         P                  ,          \         P                  ! ^ ^V4      ,          4      p\	        W1V R7      w  rEV '       g
   V^ 8X  g   Q h\	        W1R\         P
                  ! V4      ,          V R7      w  rgV\        P                  ! VRR7      8X  g   Q h\        Wd4       R# )z,Test that _polynomial_fit works as expected.r"   Gz?)weightsr#   g-q=relN)	r   sinpilinspacer   onespytestapproxr   )r#   r   r   r   polyr5   poly2logdet2s   &&      r   test_polynomial_fitrS   }   s     	A
q255y2;;q!Q//0A"1DLD{{$	
*NE fmmF6666E r   rG   z*Input array signal must be of shape \(n,\)z,Input array signal must be at least of shapez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           	         \         P                  ! WER7      ;_uu_ 4        \        WW#R7       RRR4       R#   + '       g   i     R# ; i)z"Test that whittaker raises errors.matchr   r9   rG   N)rN   raisesr   signalr   r9   rG   errmsgs   &&&&&&r   test_whittaker_raisesr^      s,    8 
s	&	&FUL 
'	&	&	&s	   8A		c                    ^p \         P                  ! ^4      p\        V^V R7      p\         P                  ! ^V ,           V .V ^V ,           ..4      ^^V ,          ,           ,          V,          p\	        VP
                  VRR7       \        \         P                  ! ^4      ^V R7       \         P                  ! ^4      p\        V^V R7      p\         P                  ! ^^V ,          ,           ^V ,          V ) .^V ,          ^^V ,          ,           ^V ,          .V ) ^V ,          ^^V ,          ,           ..4      ^^V ,          ,           ,          V,          p\	        VP
                  VRR7       VP                  V 8X  g   Q h\         P                  ! ^4      p\        V^V R7      pV ^,          p\         P                  ! ^V,          ^V ,          ,           ^,           ^V,          ^V ,          ,           ^V,          V ,
          RV,          .^V,          ^V ,          ,           ^V,          ^V ,          ,           ^,           ^V,          ^V ,          ,           ^V,          V ,
          .^V,          V ,
          ^V,          ^V ,          ,           ^V,          ^V ,          ,           ^,           ^V,          ^V ,          ,           .RV,          ^V,          V ,
          ^V,          ^V ,          ,           ^V,          ^V ,          ,           ^,           ..4      ^V,          ^V ,          ,           ^,           ,          V,          p\	        VP
                  VRR7       \        \         P                  ! ^4      ^V R7       \        \         P                  ! ^4      ^V R7       \        \         P                  ! ^4      ^V R7       \        \         P                  ! ^4      ^V R7       \        \         P                  ! ^4      ^V R7       R# )z/Test that whittaker works on a few data points.)r9   r   gV瞯<)atolN)r   r*   r   arrayr   r   r   )lar   whresla2s        r   test_whittaker_small_datarg      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   c                   \         P                  P                  ^*4      p\         P                  ! ^\         P                  ,          \         P
                  ! ^ ^V 4      ,          4      VP                  V 4      ,           p\        VR^R7      w  r4\        VRR7      p\        W5RR7       \        VR^R7      p\        VP                  VRR7       R# )zTest equivalent resultsrF   r   r9   r   r$   r%   N)r   randomdefault_rngrJ   rK   rL   standard_normalr	   r   r   r   r   )r   rngr[   x1r6   x2rd   s   &      r   $test_whittaker_direct_vs_fast_order2rq      s     ))


#CVVAIAq! 4458K8KA8NNFV$a8EB	vD	1BB'	V$a	8BBDD"5)r   c                ~   \         P                  P                  ^*4      p^dp\         P                  ! ^\         P                  ,          \         P
                  ! ^ ^V4      ,          4      pVP                  V4      pW4,           p\        VRV R7      p\        VP                  VRRR7       VP                  R8X  g   Q hR# )z.Test whittaker for penalty lamb close to zero.Hz>ri   g-C6?h㈵>r&   r`   N)r   rk   rl   rJ   rK   rL   rm   r   r   r   r   )r9   rn   r   r   noiser[   rd   s   &      r   !test_whittaker_limit_zero_penaltyrw      s     ))


#CA
qwQ1--.A"EYF 
V$e	<BBDD&t$777d??r   rM   c           	     X   ^dp\         P                  ! ^\         P                  ,          \         P                  ! ^ ^V4      ,          4      pV f   RM\         P                  ! V4      p\        VRWR7      p\         P                  ! \        V4      4      p\         P                  P                  P                  WcV^,
          R7      p\        VP                  V! V4      ^
RV,           ,          RR7       V^8X  d/   \         P                  ! VP                  4      ^ ,          ^ 8  g   Q hV^8  d=   \        P                  ! \         RR7      ;_uu_ 4        \        VR	WR7      pRRR4       M\        VR
WR7      p\        VP                  V! V4      RR7       R#   + '       g   i     L0; i)z2Test whittaker for penalty lamb close to infinity.Ng   vH7BrX   r   r   degrt   ru   z;The linear solver in Whittaker-Henderson smoothing detectedrV   g  4&kCrD   g|=r%   i)r   rJ   rK   rL   	ones_liker   r*   len
polynomial
Polynomialfitr   r   r=   rN   warnsUserWarning)rG   r9   r   r   wrd   x_polyrP   s   &&      r   %test_whittaker_limit_infinity_penaltyr      s9    	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   FF)	c                 6   ^
p \         P                  ! ^\         P                  ,          \         P                  ! ^ ^V 4      ,          4      p\	        V^ R7      p\        VP                  VRR7       \         P                  ! VP                  V4      '       d   Q hR# )zTest whittaker for lamb=0.rj   r$   r%   N)r   rJ   rK   rL   r   r   r   may_share_memory)r   r   rd   s      r   test_whittaker_unpenalizedr     sk    
A
qwQ1--.A	QQ	'BBDD!%(""244+++++r   c                    \         P                  P                  ^*4      p ^dp\         P                  ! ^\         P                  ,          \         P
                  ! ^ ^V4      ,          4      pV P                  V4      pW#,           p\        V^R7      p\         P                  ! V4      p\        V^VR7      p\        VP                  VP                  RR7       \        V^^V,          R7      p\        VP                  VP                  RR7       R# )zATest that whittaker with weights of 1 is same as without weights.rj   )r   rG   r$   r%   N)r   rk   rl   rJ   rK   rL   rm   r   r{   r   r   )	rn   r   r   rv   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           	        ^dp\         P                  ! ^\         P                  ,          \         P                  ! ^ ^V4      ,          4      pVR;;,          ^,          uu&   \         P                  ! V4      pWR&   ^ VR&   \        V^^VR7      p\         P                  ! \         P                  ! ^(^<4      ^'^<.VP                  ^',          VP                  ^<,          .4      p\        VP                  R,          VRR7       \        V^^VR7      p\         P                  P                  P                  . ROVP                  ^&,          VP                  ^',          VP                  ^<,          VP                  ^=,          .^R7      p\        VP                  R,          V! \         P                  ! ^(^<4      4      RR7       R# )	z8Test that whittaker interpolates where weights are zero.2   NN:(   <   NrX   r$   r%   ry   N)&   '   r   =   )r   rJ   rK   rL   r{   r   interpr*   r   r   r}   r~   r   )r   r   r[   r   rd   r   rP   s   &      r   (test_whittaker_zero_weight_interpolationr   6  s@    	AVVAbeeGbkk!Q223F
3K1K
VA!5MAeH 
V!1a	@BYYryyR(2r(RTT"XrttBx4HIFBDDKe4 
V!1a	@B==##''
rttBxb2448RTT"XFA ( D BDDKbiiB&7!8uEr   c            	        ^dp \         P                  ! ^\         P                  ,          \         P                  ! ^ ^V 4      ,          4      pVR;;,          ^,          uu&   \         P                  ! V4      p\         P
                  VR&   ^ VR&   \        V^^VR7      p\        VP                  R,          VP                  ^O,          RR7       \        V^^VR7      p\         P                  P                  P                  ^N^O.VP                  R,          ^R7      p\        VP                  R,          V! \         P                  ! ^P^d4      4      RR7       \        V^^VR7      p\         P                  P                  P                  . ROVP                  R,          ^R7      p\        VP                  R,          V! \         P                  ! ^P^d4      4      R	R7       R
# )z8Test that whittaker extrapolates where weights are zero.r   :P   NNrX   r$   r%   :N   r   Nry   :M   r   Ng&.>N)r   r   O   )r   rJ   rK   rL   r{   nanr   r   r   r}   r~   r   r*   )r   r[   r   rd   rP   s        r   (test_whittaker_zero_weight_extrapolationr   N  sQ   AVVAbeeGbkk!Q223F
3K1K
VA&&F3KAcF 
V!1a	@BBDDIrttBxe4 
V!1a	@B==##''2r(bdd5kq'IDBDDItBIIb#$67eD 
V!1a	@B==##'',"$$u+1'MDBDDItBIIb#$67dCr   c                 ~  a aaa R p^
o\         P                  ! ^\         P                  ,          \         P                  ! ^ ^S4      ,          4      p\         P                  ! \         P
                  ! S4      S ^ R7      oSP                  S,          oVVVV 3R lp\        WS R7      pV! WR7      p\        WERR7       R# )gn?r;   c                 p  < \         P                  ! S4      V S,          ,           p\         P                  P                  W!4      pW,
          pWD,          W,          S,          V,          ,           pRSS	,
          ^\         P                  ! VSS	,
          ,          4      ,           ,          \         P                  ! \         P                  P                  V S,          SP                  ,          4      4      ,
          \         P                  ! \         P                  P                  V4      4      ,           ,          # )g      ?g      )r   r>   r.   r/   r0   r1   r+   )
rc   r   r3   r   residr2rB   Mr   r9   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   r9   )rc   r   r$   r%   N)	r   rJ   rK   rL   r=   r>   r+   r   r   )	r9   rc   r   r   r1r   rB   r   r   s	   f     @@@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           	        ^
p^p\         P                  ! ^\         P                  ,          \         P                  ! ^ ^V4      ,          4      pVP	                  4       pVR;;,          R,          uu&   VR;;,          R,          uu&   V f   RM\         P
                  ! V4      p\        VRW%R7      pVP                  ^ 8  g   Q h. ROp\        VP                  VRR7       R	pV^,          pVP                  \        P                  ! VRR
7      8X  g   Q h\        VRV^\         P
                  ! V4      ,          R7      p	V	P                  \        P                  ! ^VP                  ,          RR
7      8X  g   Q hR# )z.Test that whittaker with REML criterion works.:NNr'   g?:   Nr'   NremlrX   rs   r%   g@$@rH   )
gD?gM~{@?get'?gs-ׇ?g7틚]?g7틚]ֿgs-ׇget'gM~{@gDʿ)r   rJ   rK   rL   copyr{   r   r   r   r   rN   rO   )
rG   r   r9   r[   r   r   rd   expectedexpected_spr   s
   &         r   test_whittaker_remlr   ~  s    	AEVVAbeeGbkk!Q223FAcFcMFdGsNGR\\!_A	QV5	DB77Q;;"H
 BDD(.K2K77fmmKT:::: afE1r||TUCV
WC88v}}Q[d;;;;r   ))r   r'   )r   r    )r'      )r'      )r'      )r'      )r      )r      )r   r    )r   r   )r   r   )r   r    )r   r   rZ   )r   r'   r   g)r   r   r   d   )r   r'   r   r   )&numpyr   rN   numpy.testingr   scipy.signalr   scipy.signal._whittakerr   r   r   r   r	   scipy.statsr
   r   r8   markparametrizerC   rS   
ValueErrorr,   r*   	TypeErrorr   r^   rg   rq   rw   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   