
    >qja=                     
   d dl Zd dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
mZmZ d dlmZ d Zd Zej"                  j%                  dd	gg d
      d        Zej"                  j%                  dddg      ej"                  j%                  dddg      d               Zej"                  j%                  g dg ddz  gdddedf ej,                  d      dddedf ej.                  d      dddedfg ddddedfg dddded fg ddd ded!fg dddd dged"fg dddd gged"fddej2                  gddded#fg dddddej2                  ged$fddej2                  gddg ded%fg      d&        Zd' Zej"                  j%                  d	g d(      d)        Zej"                  j%                  dg d*      d+        Zej"                  j%                  d,dd-g      ej"                  j%                  dg d*      d.               Zd/ Zd0 Z ej"                  j%                  d1ej2                  ejB                  d2g      d3        Z"d4 Z#ej"                  j%                  dg d      d5        Z$ej"                  j%                  d,dd-g      d6        Z%y)7    N)assert_allclose)whittaker_henderson)_logdet_difference_matrix_polynomial_fit_reml_solveh_banded_solve_WH_banded)special_ortho_groupc                    | j                   d   }d|z  }t        j                  |      }t        j                  |      }t        j                  |      }d|z   }d|z  |d<   d}||d   z  |d<   |d   |z  | d   z  |d<   |}|dk(  rd|z   ||d   z  z
  }d|d   z
  }nd|z   ||d   z  z
  }d|d   z
  }d|z  |d<   ||d   z  |d<   |d   || d   z  ||d   z  z   z  |d<   |}t        d|dz
        D ]b  }	d|z   |||	dz
     z  z
  ||	dz
     z
  }d|z  ||	<   d||	dz
     z
  }|||	   z  ||	<   ||	   || |	   z  |||	dz
     z  z   ||	dz
     z
  z  ||	<   |}d |dk\  re|dz
  }	d|z   |||	dz
     z  z
  ||	dz
     z
  }d|z  ||	<   d||	dz
     z
  }|||	   z  ||	<   ||	   || |	   z  |||	dz
     z  z   ||	dz
     z
  z  ||	<   |}|dz
  }	d|z   |||	dz
     z  z
  ||	dz
     z
  }d|z  ||	<   ||	   || |	   z  |||	dz
     z  z   ||	dz
     z
  z  ||	<   t        j                  |      }
||dz
     |
|dz
  <   ||dz
     ||dz
     |
|dz
     z  z   |
|dz
  <   t        |dz
  dd      D ](  }	||	   ||	   |
|	dz      z  z   ||	   |
|	dz      z  z
  |
|	<   * |
S )	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              `/opt/rentech/trading_bot/.venv/lib/python3.12/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Q44!A$;!A$./AaDF1ac] Hv!A#&1Q3/1u!1Q3ZAaDy!ttad{Va!f_4q1v=>! 	AvEHv!A#&1Q3/1u!1Q3ZAaDy!ttad{Va!f_4q1v=>!	AA	D6AacF?"QqsV+Aq5AaDQ44!A$;!AaC&01QqS69:AaD 	AqsVAacFqsVa!fq1vo%AacF1Q3B 4tadQqsVm#adQqsVm3!4H    c                  >   d} t        | d      j                         }|t        j                  dt        j                  |       z         z  |j
                  z  }t        j                  |       }t        j                  | | f      }t        j                  |d      |dd d f<   t        d|       D ]   }t        j                  ||      ||d | f<   " t        ||d      \  }}}t        |t        j                  j                  ||      d	       t        |t        j                  t        j                  j                  |            d	       t        |d d
 |d      \  }}}t        j                  t        j                  |            t        j                  t        j                  |d      d      z   t        j                  t        j                  |d      d      z   }	t        |t        j                  t        j                  j                  |	            d	       y )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	1a&	B{{1a Bq!tH1a[ '[[A&1crc6
'!"aT:LAvqAryyq!,59FBFF299==#345A ""Ra&!>LAvq

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           
         | }t        ||      }t        j                  t        j                  |      |d      }t	        |t        j
                  t        j                  j                  ||j                  z              d       t        j                  j                  |j                  |z        }t	        |t        j                  t        j
                  ||dkD                 d       y )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==QSS#9:Giia(GFBFF266''D.*A#BC%Pr$   r)   FTr   g?@xDc                 X   d}t        j                  dt         j                  z  t        j                  dd|      z        }t	        |||       \  }}| s|dk(  sJ t	        ||dt        j
                  |      z  |       \  }}|t        j                  |d	      k(  sJ t        ||       y
)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"1dDLD&{{$	4
*NE7 fmmF6666E4 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                 z    t        j                  ||      5  t        | |||       ddd       y# 1 sw Y   yxY w)z"Test that whittaker raises errors.matchr   r>   rN   N)rU   raisesr   r[   s         r"   test_whittaker_raisesre      s9    8 
s#	& MFUGLM M Ms   1:c                     d} t        j                  d      }t        |d|       }t        j                  d| z   | g| d| z   gg      dd| z  z   z  |z  }t	        |j
                  |d       t        t        j                  d      d|        t        j                  d      }t        |d|       }t        j                  dd| z  z   d| z  |  gd| z  dd| z  z   d| z  g|  d| z  dd| z  z   gg      dd| z  z   z  |z  }t	        |j
                  |d       |j                  | k(  sJ t        j                  d	      }t        |d|       }| dz  }t        j                  d
|z  d| z  z   dz   d|z  d| z  z   d|z  | z
  d|z  gd|z  d| z  z   d|z  d| z  z   dz   d	|z  d	| z  z   d|z  | z
  gd|z  | z
  d	|z  d	| z  z   d|z  d| z  z   dz   d|z  d| z  z   gd|z  d|z  | z
  d|z  d| z  z   d
|z  d| z  z   dz   gg      d|z  d| z  z   dz   z  |z  }t	        |j
                  |d       t        t        j                  d      d|        t        t        j                  d	      d|        t        t        j                  d      d|        t        t        j                  d      d|        t        t        j                  d      d|        y)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                    t         j                  j                  d      }t        j                  dt         j                  z  t        j
                  dd|       z        |j                  |       z   }t        |dd      \  }}t        |d      }t        ||d	       t        |dd      }t        |j                  |d	       y
)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                 ^   t         j                  j                  d      }d}t        j                  dt         j                  z  t        j
                  dd|      z        }|j                  |      }||z   }t        |d|       }t        |j                  |dd	
       |j                  dk(  sJ y)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                    d}t        j                  dt         j                  z  t        j                  dd|      z        }| dnt        j                  |      }t        |d||      }t        j                  t        |            }t         j                  j                  j                  |||dz
        }t        |j                   ||      d	d
|z   z  d       |dk(  r't        j                  |j                        d   dk  sJ |dkD  r4t        j                  t         d      5  t        |d||      }ddd       nt        |d||      }t        |j                   ||      d       y# 1 sw Y   (xY w)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      sF    	A
qwQ1--.AR\\!_A 
QT	BBYYs1vF==##''&A519'EDBDD$v,R"u*-=DIz wwrtt}Q!###qy \\O
 	K %QTJB		K 	K !UAFBDD$v,U3	K 	Ks   'E..E7c                     d} t        j                  dt         j                  z  t        j                  dd|       z        }t	        |d      }t        |j                  |d       t        j                  |j                  |      rJ y)	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     sh    
A
qwQ1--.A	QQ	'BBDD!%(""244++++r$   c                     t         j                  j                  d      } d}t        j                  dt         j                  z  t        j
                  dd|      z        }| j                  |      }||z   }t        |d      }t        j                  |      }t        |d|      }t        |j                  |j                  d	       t        |d
d
|z        }t        |j                  |j                  d	       y)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           	         d}t        j                  dt         j                  z  t        j                  dd|      z        }|ddxxx dz  ccc t        j                  |      }| |dd d|dd t        |dd|	      }t        j                  t        j                  dd      d
dg|j                  d
   |j                  d   g      }t        |j                  dd |d       t        |dd|	      }t         j                  j                  j                  g d|j                  d   |j                  d
   |j                  d   |j                  d   gd      }t        |j                  dd  |t        j                  dd            d       y)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  sL    	AVVAbeeGbkk!Q223F
23K1K
VA!F2bM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            	      d   d} t        j                  dt         j                  z  t        j                  dd|       z        }|ddxxx dz  ccc t        j                  |      }t         j
                  |dd d|dd t        |dd|      }t        |j                  dd |j                  d	   d
       t        |dd|      }t         j                  j                  j                  dd	g|j                  dd d      }t        |j                  dd  |t        j                  dd            d
       t        |dd|      }t         j                  j                  j                  g d|j                  dd d      }t        |j                  dd  |t        j                  dd            d       y)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                 `    d}dt        j                  dt         j                  z  t        j                  dd      z        }t        j                  t        j
                         d      j                  z   fd}t        ||       } |||	      }t        ||d
       y )Ngn?r&   r   r   r   rB   c                    t        j                        | z  z   }t         j                  j                  ||      }||z
  }||z  | |z  z  |z  z   }d	z
  dt        j                  |	z
  z        z   z  t        j                  t         j                  j                  | z  j                  z              z
  t        j                  t         j                  j                  |            z   z  S )Ng      r   )r   rE   r3   r4   r5   r6   r0   )
rn   r   r8   r!   residr2rI   Mr   r>   s
         r"   	test_remlz&test_reml_criterion.<locals>.test_remlo  s    FF1IQIIOOAq!AU]R!VaZ!^+%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 
B!5	)B	bA	BB'r$   c           	         d}d}t        j                  dt         j                  z  t        j                  dd|      z        }|j	                         }|dddxx   dz  cc<   |dddxx   dz  cc<   | dnt        j
                  |      }t        |d||      }|j                  dkD  sJ g d	}t        |j                  |d
       d}|dz  }|j                  t        j                  |d
      k(  sJ t        |d|dt        j
                  |      z        }	|	j                  t        j                  d|j                  z  d
      k(  sJ y)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*;=RXXa[!Qj;=RYYr]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$   