
    (ph                     $   S SK r S SKrS SKrS SKJrJr  S SKJrJr  S SK	J
r
Jr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 rS rS	 r " S
 S5      r " S S5      r " S S5      r " S S5      r " S S5      rS r " S S5      r  " S S5      r!g)    N)raiseswarns)xp_assert_closexp_assert_equal)	argrelmax	argrelminpeak_prominencespeak_widths_unpack_condition_args
find_peaksfind_peaks_cwt_identify_ridge_lines)gaussian)_local_maxima_1dPeakPropertyWarningc                    [         R                  " SU5      R                  [        5      n[         R                  " U[        S9n[        U5       H,  u  pVX0U   -
  U-  nU[         R                  " US-  * 5      -  nM.     U$ )Nr   dtype   )nparangeastypefloatzeros	enumerateexp)center_locssigmastotal_lengthxdataout_dataindsigmatmps           W/var/www/html/venv/lib/python3.13/site-packages/scipy/signal/tests/test_peak_finding.py_gen_gaussiansr&      sp    IIa&--e4ExxE2H'
3''50BFFS!V9%% ( O    c                     [        U 5      nXS-   -  n[        R                  " X1U-
  US9R                  [        5      n[        X@U5      nXT4$ )N   )num)lenr   linspacer   intr&   )r   r   	num_peaksdeltar   r!   s         r%   _gen_gaussians_evenr0      sM    FIM*E++eE%9yIPPQTUKk<@H  r'   c                    S n[         R                  " U5      n[         R                  " U5      n[        R                  " US/[        S9nXSSS24'   US   U S   -
  [        U5      -
  nXr:  a  [        S5      eU[        U5      -  S-
  nU[        U5      -  S-
  n	[        SU5       H  n
XjS-
  S4   nXjS-
  S4   S-   nX-  S:X  a(  [        U5      S:  a  USU
-  UR                  5       -  -  nX-  S:X  a!  [        U5      S:  a  XR                  5       -  nU" XS   5      nU" XS   5      nX/XjSS24'   M     USS2S4   USS2S4   /$ )	a  
Generate coordinates for a ridge line.

Will be a series of coordinates, starting a start_loc (length 2).
The maximum distance between any adjacent columns will be
`max_distance`, the max distance between adjacent rows
will be `map_gap'.

`max_locs` should be the size of the intended matrix. The
ending coordinates are guaranteed to be less than `max_locs`,
although they may not approach `max_locs` at all.
c                 4    [        U S5      n[        X!5      nU$ )Nr   )maxmin)r*   max_valouts      r%   keep_bounds$_gen_ridge_line.<locals>.keep_bounds5   s    #qk#
r'   r   r   r   Nz3Cannot generate ridge line according to constraintsr)   )
copydeepcopyr   r   r-   sum
ValueErrorr+   rangepop)
start_locsmax_locslength	distancesgapsr7   locsr   dist_intgap_intr"   nextcolnextrows                r%   _gen_ridge_linerJ   '   sd   
 ==Di(I88VQKs+DAJA;A.T:LNOOI&*Hs4y 1$GQQwz"Qwz"Q&Nac)nq&8c	9==?22GMQSY]xxz!Gg{3g{3)!V   AJQT
##r'   c            	           \ rS rSrS rS rS rS r\R                  R                  S\R                  " / SQ5      \R                  " / SQ5      \R                  " / S	Q5      /5      S
 5       rS rSrg)TestLocalMaxima1dR   c                     [         R                  " / [         R                  S9n[        U5       H1  n[	        U[         R                  " / 5      SS9  UR
                  c  M1   e   g)zTest with empty signal.r   Fcheck_dtypeN)r   arrayfloat64r   r   baseselfxrQ   s      r%   
test_emptyTestLocalMaxima1d.test_emptyT   sI    HHRrzz*%a(EE288B<UC::%%% )r'   c           	          [         R                  " SS5      n[        U5       H?  n[        U[         R                  " / [         R
                  S95        UR                  c  M?   e   g)zTest with linear signal.r   d   r   N)r   r,   r   r   rQ   intprS   rT   s      r%   test_linearTestLocalMaxima1d.test_linear[   sJ    KK3%a(EE288Bbgg#>?::%%% )r'   c                     [         R                  " SSS5      nUSSS2==   S-  ss'   [         R                  " SSS[         R                  S9n[	        U5       H  n[        X2S	S
9  UR                  c  M   e   g)zTest with simple signal.
   2   r   N   r)   r   FrO   )r   r,   r   r[   r   r   rS   )rU   rV   expectedrQ   s       r%   test_simpleTestLocalMaxima1d.test_simpleb   sj    KKR$	!$Q$199QARWW5%a(E E?::%%%	 )r'   c                    [         R                  " / SQ5      n[        U5      u  p#n[        U[         R                  " / SQ5      SS9  [        U[         R                  " / SQ5      SS9  [        U[         R                  " / SQ5      SS9  g)z+Test if flat maxima are detected correctly.)gr   r)   r   r   r   r   rb   rb   rb   gQ@   rg   rg   rg   r_   rh   rh   rh   rh   r_   )r   rg            FrO   )r   rg            )r      	         N)r   rQ   r   r   )rU   rV   	midpoints
left_edgesright_edgess        r%   test_flat_maxima"TestLocalMaxima1d.test_flat_maximam   sf    HH / 0-=a-@*	{	288,=#>ER
BHH->$?USRXX.?%@eTr'   rV   )      ?r   r   )      @rb   r   rg   rg   )      @ro   ro   r      r{   r{   c           	          [        U5       H?  n[        U[        R                  " / [        R                  S95        UR
                  c  M?   e   g)z,Test if behavior on signal edges is correct.r   N)r   r   r   rQ   r[   rS   rT   s      r%   test_signal_edges#TestLocalMaxima1d.test_signal_edgesv   s<     &a(EE288Bbgg#>?::%%% )r'   c                    [        [        SS9   [        [        R                  " S5      5        SSS5        [        [        SS9   [        [        R                  " S[
        S95        SSS5        [        [        SS9   [        S	S
/5        SSS5        [        [        SS9   [        S5        SSS5        g! , (       d  f       N= f! , (       d  f       Nf= f! , (       d  f       NS= f! , (       d  f       g= f)z,Test input validation and raised exceptions.zwrong number of dimensionsmatch)r)   r)   Nzexpected 'const float64_t'r)   r   listrx          @z'x' must not be None)r   r=   r   r   onesr-   	TypeErrorrU   s    r%   test_exceptions!TestLocalMaxima1d.test_exceptions   s    J&BCRWWV_- DJ&BCRWWQc23 DIV,b"X& -I%;<T" =< DCCC,,<<s/    B7#C>C"C*7
C
C
C'*
C8 N)__name__
__module____qualname____firstlineno__rW   r\   rd   rv   pytestmarkparametrizer   rQ   r}   r   __static_attributes__r   r'   r%   rL   rL   R   sl    &&	&U [[S

!"
'(# 
&
&	#r'   rL   c                   8    \ rS rSrS rS rS rS rS rS r	Sr
g	)
TestRidgeLines   c                     [         R                  " SS/5      n[        U[         R                  " SS5      S5      n[	        U5      S:X  d   eg )Nrr   rZ   r   r)   r   r   r   r   fullr+   rU   	test_matrliness      r%   rW   TestRidgeLines.test_empty   s<    HHb#Y'	%iQC5zQr'   c                 L   [         R                  " SS/5      nSUS'   [        U[         R                  " SS5      S5      n[	        U5      S:X  d   e[         R                  " SS/5      nSUSS2S4'   [        U[         R                  " SS5      S5      n[	        U5      S:X  d   eg )Nrr   rZ   r)   )r   r`   r   r   r`   r   r   s      r%   test_minimalTestRidgeLines.test_minimal   s    HHb#Y'		%%iQC5zQHHb#Y'		!A#r'%iQC5zQr'   c                 r   / SQn/ SQn[         R                  " SS/5      S-   nSn[        SS/UR                  XAU5      nS	X5S   US	   4'   [         R                  " S[        U5      5      n[        UU[        U5      S	-   5      n[        U5      S	:X  d   e[        US   U5       H  u  p[        XS
S9  M     g )Nr   r)   r   ro   )r   r)   r   r   r)   rr   ra   g-q=rj   r      r)   FrO   )
r   r   rJ   shaper   r3   r   r+   zipr   )
rU   rC   rD   r   rB   linemax_distancesidentified_linesiline_line_s
             r%   test_single_passTestRidgeLines.test_single_pass   s     	HHb"X&.	2w	DQ&'	q'47"#C	N301>14TQ@ #$))) !1!!4d;MFFu= <r'   c                 x   / SQn/ SQn[         R                  " SS/5      nSn[        SS/UR                  XAU5      nSX5S   US   4'   S	n[         R                  " SU5      n[        UU[        U5      S-   5      n[        U5      S
:X  d   eU H  n	[         R                  " U	S   5      n
[         R                  R                  [         R                  " U
5      U5        [         R                  " U	S   5      n[         R                  R                  [         R                  " U5      [        U5      S-   5        M     g )Nr   )r   r)   r   rg   rr   ra   rj   r   r   r)   rb   r   皙?)r   r   rJ   r   r   r   r3   r+   difftestingassert_array_lessabs)rU   rC   rD   r   rB   r   max_distr   r   ilineadistsagapss               r%   test_single_bigdist"TestRidgeLines.test_single_bigdist   s    	HHb"X&	2w	DQ&'	q'47"#H-01>14TQ@ #$)))%EWWU1X&FJJ((BGGE!H%EJJ((D	CH &r'   c                 b   / SQnSn/ SQn[         R                  " SS/5      nSn[        SS/UR                  XQU5      nS	XFS   US	   4'   S
n[         R                  " SU5      n[        XHU5      n	[        U	5      S:X  d   eU	 H  n
[         R                  " U
S	   5      n[         R                  R                  [         R                  " U5      U5        [         R                  " U
S   5      n[         R                  R                  [         R                  " U5      [        U5      S-   5        M     g )Nr   rb   )r   rg   r   r)   rr   ra   rj   r   r   r)   r{   r   r   r   r   rJ   r   r   r   r+   r   r   r   r   r3   rU   rC   max_gaprD   r   rB   r   r   r   r   r   r   r   s                r%   test_single_biggap!TestRidgeLines.test_single_biggap   s     	HHb"X&	2w	DQ&'	q'47"#H-07S#$)))%EWWU1X&FJJ((BGGE!H%EJJ((D	CH &r'   c                 `   S/nSnSS/n[         R                  " SS/5      nSn[        SS/UR                  XQU5      nSXFS   US   4'   Sn[         R                  " SU5      n[        XHU5      n	[        U	5      S:X  d   eU	 H  n
[         R                  " U
S   5      n[         R                  R                  [         R                  " U5      U5        [         R                  " U
S   5      n[         R                  R                  [         R                  " U5      [        U5      S-   5        M     g )	Nr   r)   rb   r{   ra      r   r   r   r   s                r%   test_single_biggaps"TestRidgeLines.test_single_biggaps   s    C	1vHHb"X&	2w	DQ&'	q'47"#H-07S#$)))%EWWU1X&FJJ((BGGE!H%EJJ((D	CH &r'   r   N)r   r   r   r   rW   r   r   r   r   r   r   r   r'   r%   r   r      s#    
	>I,I*Ir'   r   c                   ,    \ rS rSrS rS rS rS rSrg)
TestArgrel   c                 j   [         R                  " / [        S9n[         R                  " S5      n[	        U5      n[        [        U5      S5        [        US   USS9  [         R                  " S5      n[	        USS9u  pV[        XQSS9  [        XaSS9  [	        USS9u  pV[        XQSS9  [        XaSS9  g )	Nr   ro   r)   r   FrO   )rb   ro   axis)r   rQ   r-   r   r   r   r+   )rU   empty_arrayz1iz2rowcols          r%   rW   TestArgrel.test_empty   s     hhr-XXa[bMA"!ku=XXfRa(e<e<Ra(e<e<r'   c                 N   [         R                  " / SQ/ SQ/ SQ/ SQ/ SQ/5      n[        USS9u  p#[         R                  " U5      n[	        X$   / SQS	S
9  [	        X4   / SQS	S
9  [        USS9u  p#[         R                  " U5      n[	        X$   / SQS	S
9  [	        X4   / SQS	S
9  [        USS9u  p#[         R                  " U5      n[	        X$   / SQS	S
9  [	        X4   / SQS	S
9  [        USS9u  p#[         R                  " U5      n[	        X$   / SQS	S
9  [	        X4   / SQS	S
9  g )N)r)   r   r   rb   r   )r   r)   r   r   rb   )rb   r   r)   r   r   )r   rb   r   r)   r   )r)   r   rb   r   r)   r   r   r)   r   rb   FrO   )rg   r   r)   r)   )r   rb   rg   )rb   r)   r   )r   rQ   r   argsortr   r   )rU   rV   r   r   orders        r%   
test_basicTestArgrel.test_basic	  s   
 HHo%%%%	' ( QQ'

3
I5A
I5AQQ'

3
I5A
I5AQQ'

3
I5A
I5AQQ'

3
I5A
I5Ar'   c                     Sn/ SQn[        US5      u  p4X4   S-  X4U-   '   X4   S-  X4U-
  '   [        X1SS9S   n[        U5      [        U5      :X  d   eXT:H  R                  5       (       d   eg )Nr   )rx   r         $@rz   g      .@  gwJ?clip)r   moder   )r0   r   r+   all)rU   r   r   	test_dataact_locsrel_max_locss         r%   test_highorderTestArgrel.test_highorder(  s    ,1&#>	&/&9'&A	U"#&/&9'&A	U"# fEaH< CM111(--////r'   c                    / SQn[        US5      u  p#Sn[        R                  " S[        U5      5      U-
  n[        R                  " X"U   /5      n[        USSS9u  px[        SUR                  S   5       HD  n	Xy:H  n
[        X   5      [        U5      :X  d   eX8U
   XI-  -
  :H  R                  5       (       a  MD   e   g )N)rx   r   r   rZ   rr   r   r)   )r   r   )	r0   r   r   r+   vstackr   r>   r   r   )rU   r   r   r   
rot_factor	rot_rangetest_data_2rel_max_rowsrel_max_colsrwindss              r%   test_2d_gaussiansTestArgrel.test_2d_gaussians3  s    !1&#>	
IIaY0:=	iii,@ AB%.{!%L";,,Q/0B &D|)*c(m;;;d!3jm!CDIIKKKK	 1r'   r   N)	r   r   r   r   rW   r   r   r   r   r   r'   r%   r   r      s    =0B>	0Lr'   r   c                   p    \ rS rSrS rS rS rS rS rS r	\
R                  R                  S 5       rS	rg
)TestPeakProminencesiB  c                    [        / SQ/ 5      n[        U[        R                  [        R                  [        R                  /5       H)  u  p#UR
                  S:X  d   eUR                  U:X  a  M)   e   [        / / 5      n[        U[        R                  [        R                  [        R                  /5       H)  u  p#UR
                  S:X  d   eUR                  U:X  a  M)   e   g)>
Test if an empty array is returned if no peaks are provided.
r   r   N)r	   r   r   rR   r[   sizer   )rU   r6   arrr   s       r%   rW   TestPeakProminences.test_emptyD  s     y"-cBJJ#ABJC88q= =99%%% C r2&cBJJ#ABJC88q= =99%%% Cr'   c                 n   [         R                  " / SQ5      n[         R                  " / SQ5      n[         R                  " / SQ5      n[         R                  " / SQ5      nX   [         R                  " X   X   /SS9-
  n[        X5      n[	        US   USS9  [	        US	   USS9  [	        US
   USS9  g)zr
Test if height of prominences is correctly calculated in signal with
rising baseline (peak widths are 1 sample).
)r9   333333?r   r)   皙	@g?g
ףp=
@g @)r)   r   rg   r{   )r   r   r   ro   )rb   rb   ro   rl   r   r   FrO   r)   r   N)r   rQ   r3   r	   r   )rU   rV   peakslbasesrbasespromsr6   s          r%   r   TestPeakProminences.test_basicR  s     HH;<&,','26619ai"8qAAq(A59AE:AE:r'   c                 r   / SQn/ SQn[        X5      u  p4n[        U[        R                  " / SQ5      SS9  [        U/ SQSS9  [        U/ SQSS9  / SQn[        R                  " / SQ5      n[        X5      u  p4n[        U[        R                  " / S	Q5      5        [        XBS
-
  SS9  [        XRS
-   SS9  g)z
Test edge cases.
)r   r   r)   r   r)   r   r   r)   rb   ro   )r   r   r   FrO   )r   r   r   )r{   r{   r{   )r   r)   r   r)   r   r)   r   )rx   r)   r)   r)   N)r	   r   r   asarrayrQ   rU   rV   r   r   r   r   s         r%   test_edge_cases#TestPeakProminences.test_edge_casesc  s    
 " 0 :vrzz+6EJ	u=	u= "# 0 :vrzz+67	u=	u=r'   c                    [         R                  " / SQS5      n[         R                  " / SQS5      n[        USSS2   USSS2   5      u  p4n[        U[         R                  " / SQ5      5        [        U/ SQSS9  [        U/ S	QSS9  g)
*
Test with non-C-contiguous input arrays.
)irp   rp   r   rb   r)   r   )r)   r   rg   N)g      "@rp   r   )r   r   rb   FrO   )rb   rb   ro   )r   repeatr	   r   r   r   s         r%   test_non_contiguous'TestPeakProminences.test_non_contiguousw  sq     II)1-		)Q' 03Q3ss Dvrzz+67	u=	u=r'   c                     / SQnS/n[        X5      n[        U/ SQ5       H  u  pEXE:X  a  M   e   S H9  u  pg[        XU5      n[        USU-
  SU-   SU-
  /5       H  u  pEXE:X  a  M   e   M;     g)	z?
Test if wlen actually shrinks the evaluation range correctly.
)r   r)   r   rb   r)   r   r9   rb   )ry   r   r{   ))ri   r   )rl   r   )r{   r   )ro   r)   )r   r)   rb   r   )皙?r   ry   r   r{   N)r	   r   )rU   rV   peakr   promvalwlenr   s           r%   	test_wlenTestPeakProminences.test_wlen  s     #s )UK0ID;; 1 TGD$Qd3E aQA(>?	{"{ @ Tr'   c                 B   [        [        SS9   [        / SQ/SS/5        SSS5        [        [        SS9   [        / SQSS//5        SSS5        [        [        SS9   [        SS/5        SSS5        [        [        S	S9   [        / S/5        SSS5        S
 H)  n[        [        S	S9   [        / SQU/5        SSS5        M+     [        [        SS9   [        / SQSS/5        SSS5        [        [        SS9   [        [        R
                  " S5      SS/SS9  SSS5        g! , (       d  f       GN= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       M  = f! , (       d  f       N= f! , (       d  f       g= f)z1
Verify that exceptions and warnings are raised.
	1-D arrayr   )r   r)   r)   r   r)   r   Nrb   r   not a valid index)ir9   rb     r)   r   r   cannot safely castr  ffffff@r
  r`   ro   r
  )r   r=   r	   r   r   r   )rU   ps     r%   r   #TestPeakProminences.test_exceptions  s5   
 Jk2l^aV4 3 Jk2\QF84 3 Jk2Q% 3 J&9:R!% ; %A
*=> QC0 ?> %
 I%9:\C:6 ; Jf-RYYr]QF; .-- 32 32 32 ;: ?> ;: .-sR   D(D:EE,E-E?="F(
D7:
E
E
E*-
E<	?
F
Fc                     SnS H)  n[        [        US9   [        / SQU/5        SSS5        M+     [        [        US9   [        / SQS/SS9  SSS5        g! , (       d  f       Mb  = f! , (       d  f       g= f)	.
Verify that appropriate warnings are raised.
z!some peaks have a prominence of 0)r   r)   r   r   r  Nr   r)   r)   r)   r   r   r  )r   r   r	   )rU   msgr  s      r%   test_warnings!TestPeakProminences.test_warnings  se    
 2A*#6 QD1 76  &c2_qc: 32 7622s   A A*
A'	*
A8r   N)r   r   r   r   rW   r   r   r  r  r   r   r   thread_unsafer  r   r   r'   r%   r   r   B  s>    &;">(	># << [[	; 	;r'   r   c                       \ rS rSrS r\R                  R                  S5      S 5       rS r	S r
\R                  R                  S 5       rS r\R                  R                  S5      S	 5       rS
rg)TestPeakWidthsi  c                    [        / / 5      S   n[        U[        R                  5      (       d   eUR                  S:X  d   e[        / SQ/ 5      S   n[        U[        R                  5      (       d   eUR                  S:X  d   e[        / / 5      nU H6  n[        U[        R                  5      (       d   eUR                  S:X  a  M6   e   g)r   r   r   N)r
   
isinstancer   ndarrayr   )rU   widthsr6   r   s       r%   rW   TestPeakWidths.test_empty  s     R$Q'&"**----{{aY+A.&"**----{{a"b!Cc2::....88q= = r'   #ignore:some peaks have a width of 0c           	         [         R                  " / SQ5      nSnS H  u  p4pV[        US/U5      u  pxp[        U[         R                  " U/5      5        [        U[         R                  " SX2-  -
  /5      5        [        U	[         R                  " U/5      5        [        U
[         R                  " U/5      5        M     g)zS
Test a simple use case with easy to verify results at different relative
heights.
)r)   r   r)   r   r)   r   r9   r   ))        r'  ry   ry   )g      ?rx         @      @)      ?r   r         @)      ?ry         ?      @)rx   r+  rx   rz   )r   rz   rx         @)ry   rz   rx   r/  rb   N)r   rQ   r
   r   r   )rU   rV   
prominence
rel_height
width_truelip_truerip_true
width_calcheightlip_calcrip_calcs              r%   r   TestPeakWidths.test_basic  s     HH+,
;
6JH 6AA3
6$2JJ

J<(@AFBJJJ4K0K/L$MNHbjj(&<=Hbjj(&<=;
r'   c           	          [         R                  " / SQS5      n[         R                  " S/S5      n[        USSS2   USSS2   5      n[        U[         R                  " S/S/S/S//5      5        g)	r   )r   rZ   ra   rg   r)   rb   Nr,  K   r-  )r   r  r
   r   r   )rU   rV   r   results       r%   r  "TestPeakWidths.test_non_contiguous  si     IIlA&		1#q!QssVU3Q3Z0

TFRD4&3%#@A	
r'   c           	          [        [        SS9   [        [        R                  " S5      [        R
                  " S5      5        SSS5        [        [        SS9   [        SS/5        SSS5        [        [        SS9   [        [        R                  " S5      [        R
                  " S[        R                  S	95        SSS5        [        [        SS9   [        [        R                  " S5      S5        SSS5        [        [        S
S9   [        [        R                  " S5      SS/5        SSS5        [        [        S
S9   [        / SS/5        SSS5        [        [        SS9   [        [        R                  " S5      SS/5        SSS5        [        [        SS9   [        / SQSS/SS9  SSS5        [        [        SS9   [        / SQS/SS9  SSS5        g! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       GNM= f! , (       d  f       GN(= f! , (       d  f       GN= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       g= f)z4
Verify that argument validation works as intended.
r  r   )rb   rg   rb   Nr   r`   r  r   r  ri   rm   r)   r   r  r  r  r1  )r   r)   r   r)   r   r9   r1  None)r)   r   r)   )NNNprominence_data)	r   r=   r
   r   r   r   r   r[   r   r   s    r%   r   TestPeakWidths.test_exceptions  s    Jk2("''!*5 3 Jk2A3 3 Jk2		"rwwvRWW'EF 3 Jk2		"q) 3 J&9:		"2w/ ; J&9:QF# ; I%9:		"Sz2 ; Jl3!QB? 4 IV,	A38JK -,1 32 32 32 32 ;: ;: ;: 43 -,sl   5G"G4>AH!H#H*H<+#I$I
I/"
G14
H
H
H'*
H9<
I

I
I,/
I=c                    Sn[        [        US9   [        / SQS/SS9  SSS5        [        [        US9   [        / SQS	/[        R                  " S
/[        R
                  5      [        R                  " S	/[        R                  5      [        R                  " S	/[        R                  5      4S9  SSS5        g! , (       d  f       N= f! , (       d  f       g= f)r  zsome peaks have a width of 0r   r   r)   r   r)   r   r?  Nr  r   r'  rA  )r   r   r
   r   rQ   rR   r[   )rU   r  s     r%   r  TestPeakWidths.test_warnings  s    
 -&c2	A315 3 &c2!!#2$

!;!#1#rww!7!#1#rww!7!9 32 32 32s   B=A>C=
C
Cc                    / SQnS/n[        / SQ5       H  u  nu  pEn[        R                  " U[        R                  S9[        R                  " U[        R                  S9[        R                  " U[        R                  S94nUS:  a  SnOSn[        [        US9   [        XUS	9  S
S
S
5        M     g
! , (       d  f       M  = f)z4Test with mismatching peak and / or prominence data.rE  r)   ))rx   )r9   r   )rH  r   )rb   )rH  rI  rJ  )rx   rx   r   r   r   r   )rK  rJ  rI  )rH  rL  rI  )rH  rJ  rM  r   rb   z#prominence data is invalid for peakz4arrays in `prominence_data` must have the same shaper   rA  N)r   r   rQ   rR   r[   r   r=   r
   )	rU   rV   r  r   prominences
left_basesright_basesrB  r   s	            r%    test_mismatching_prominence_data/TestPeakWidths.test_mismatching_prominence_data#  s    s9B D
 :5A5  "xx2::F!xx
"''B!xx277CEO 1u=N
%0A_E 10%:$ 10s   B77
C	c                 l    / SQn[        [        US/SS9/ SQ5        [        [        US/SS9/ SQ5        g)	z3Test if x == eval_height counts as an intersection.)r   r)   r   r)   rb   rb   rb   r)   r   r)   r   ro   r   )r   r1  ))r'  ry   rz   rU  gUUUUUU?))r+  rH  rT  )g      @N)r   r
   )rU   rV   s     r%   test_intersection_rules&TestPeakWidths.test_intersection_rules<  s;     .AaSQ?4	6 	AaSSA4	6r'   r   N)r   r   r   r   rW   r   r   filterwarningsr   r  r   r  r  rQ  rV  r   r   r'   r%   r  r    s    ! [[ EF> G>.	
L@ [[ "F2 [[ EF	6 G	6r'   r  c                     [         R                  " S5      n U nUS-   nUSSS2   nS[        SX5      :X  d   eS[        SX5      :X  d   eS[        SX5      :X  d   eS[        SX5      :X  d   eS[        SX5      :X  d   e[        X4X5      u  pE[        XAU   5        [        XRU   5        [	        [
        S	S
9   [        U[         R                  " S5      U5        SSS5        [	        [
        SS
9   [        SU4[         R                  " S5      U5        SSS5        g! , (       d  f       NI= f! , (       d  f       g= f)zO
Verify parsing of condition arguments for `scipy.signal.find_peaks` function.
r`   r)   Nr   NN)r)   NNr   )ry   r.  zarray size of lowerr   rm   zarray size of upper)r   r   r   r   r   r=   )rV   	amin_true	amax_truer   	amin_calc	amax_calcs         r%   test_unpack_condition_argsr`  I  s.    			"AIBIaddOE 1,IIII.q!;;;;.y!CCCC.y!CCCC.y!CCCC 292H!SII/0I/0 

"7	8y"))B-? 
9	
"7	8i0"))B-G 
9	8 
9	8	8	8s   9"D1$D/
D,/
D=c                       \ rS rSr1 SkrS rS rS rS rS r	S r
S	 rS
 rS r\R                  R!                  SS5      S 5       r\R                  R%                  S0 SS0SS0SS0/5      S 5       rSrg)TestFindPeaksie  >
   r#  left_ips	right_ipsrO  rN  rP  peak_heightswidth_heightsleft_thresholdsright_thresholdsc                     Sn[        [        R                  " S5      XXS9u  p#UR                  S:X  d   eU R                   H  nX4   R                  S:X  a  M   e   g)z0
Test behavior for signal without local maxima.
rZ  r`   r6  	thresholdr0  widthr   N)r   r   r   r   property_keys)rU   open_intervalr   propskeys        r%   test_constantTestFindPeaks.test_constantl  s\     %!"''"+)6-:Q zzQ%%C:??a''' &r'   c                 L   [         R                  " / SQ5      n[         R                  " UR                  S-  S-   5      nXSSS2'   [         R                  " UR                  [
        S9nUSSS2   USSS2'   [         R                  " X#5      n[        USS9u  pE[        U/ SQS	S
9  [        US   US	S
9  [        US   XAS-
  S-  -
  S	S
9  [        US   XAS-  -   S	S
9  [        [        USS9S   / SQS	S
9  [        [        USS9S   / SQS	S
9  [        [        USS9S   SS/S	S
9  g)z(
Test plateau size condition for peaks.
)r)   r   rb   rg   ri   rr   o   r   r)   Nr   rZ  )plateau_size)r)   rb   rl   rm   rk   !   rZ   FrO   plateau_sizesrt   ru   rg   r   )rm   rk   rv  rZ   )Nr)  )r)   rb   rl   )ro   ra   rk   rv  )	r   rQ   r   r   r   r-   r  r   r   )rU   rw  rV   repeatsr   ro  s         r%   test_plateau_sizeTestFindPeaks.test_plateau_sizex  s<   
 !9:HH]''!+a/0!$Q$''!&&,!$Q$1IIa! "!,?9uMo.5Ql+Ua6GA5M-M$)	+m,eq6H.H$)	+ 	
115a8:K$)	+
1;?BI$)	+
17;A>R$)	+r'   c                    Sn[        USS9u  p#[        U[        R                  " / SQ5      SS9  [        US   [        R                  " / SQ5      SS9  [        [        US	S9S
   [        R                  " SS/5      SS9  [        [        USS9S
   [        R                  " SS/5      SS9  [        [        USS9S
   [        R                  " S/5      SS9  g)z"
Test height condition for peaks.
)r'  UUUUUU?r'  r(  r   r+  r   rZ  )r6  r   FrO   re  )r|  r(  r+  r*  r   rb   ro   )Nrb   r)   )r   rb   N)r   r   r   rQ   rU   rV   r   ro  s       r%   test_height_condition#TestFindPeaks.test_height_condition  s     )!!L9rxx	2Fn-rxx/G$)	+
1S1!4bhh1v6F$)	+
1Y7:BHHaV<L$)	+
1V4Q71#$)	+r'   c                    Sn[        USS9u  p#[        U[        R                  " SS/5      SS9  [        US   [        R                  " S	S
/5      5        [        US   [        R                  " SS/5      5        [        [        USS9S   [        R                  " S/5      SS9  [        [        USS9S   [        R                  " / [        S9SS9  [        [        USS9S   [        R                  " SS/5      SS9  [        [        USS9S   [        R                  " S/5      SS9  [        [        USS9S   [        R                  " / [        S9SS9  g)z%
Test threshold condition for peaks.
)r   r   r)   rg   r9   rZ  )rk  r)   rb   FrO   rg  r   ry   rh  rx   rz   r   r   r)  r   )Nro   )Nrg   )r   rg   N)r   r   r   rQ   r-   r}  s       r%   test_threshold_condition&TestFindPeaks.test_threshold_condition  s(    !!|<rxxA/UC/0"((C:2FG01288S#J3GH
1215rxx}$)	+
14Q7"C9P$)	+
1	:1=rxxA?O$)	+
1	:1=rxx}$)	+
17:BHHRs<S$)	+r'   c                    [         R                  " SSS5      n[         R                  " S5      nX!==   [         R                  " SSUR                  5      -  ss'   [        [        USS9S   USS9  [        US	S9S   n[         R                  " X1S
S9R                  S:X  d   e[         R                  " U5      n[        US[         R                  " U5      -  5        / SQn[        USS9S   nUR                  S:X  a	  US   S:X  d   eg)z$
Test distance condition for peaks.
r)      rb   r   distancer   FrO   g9m4 @T)assume_uniquer{   )r)   r9   r   r`   N)
r   r   r   r,   r   r   r   	setdiff1dr   	ones_like)rU   	peaks_allrV   peaks_subsetdfss        r%   test_distance_condition%TestFindPeaks.test_distance_condition  s    
 IIaQ'	HHRL	Aq)..99 	
1q1!4iUS "!f5a8||L4HMMQRRRR ggl#Qr||C001 !!b1!4  A%,q/Q*>>>*>r'   c                    [         R                  " SSS5      n[         R                  " SSS5      n[         R                  " SSUR                  5      nX==   U-  ss'   X   XS-      -
  nSn[         R                  " US   U:*  XES   :*  -  5      n[        XS9u  px[        XrU   S	S
9  [        US   XF   S	S
9  [        US   [         R                  " US   5      5        [        US   X&   S-   S	S
9  g)z&
Test prominence condition for peaks.
r   r`   rZ   r)   c   r   )rb   rp   )r0  FrO   rN  rO  rP  N)r   r,   r   r   nonzeror   r   
zeros_like)	rU   rV   
peaks_trueoffsetrN  intervalkeep
peaks_calc
propertiess	            r%   test_prominence_condition'TestFindPeaks.test_prominence_condition  s     KK2s#YYq"a(
QJOO4	maQ&77zza[K'KA;,FGI ",A!C

t$4%H
=1;3DRWX
<0j&>?	A
=1:3Ca3G$)	+r'   c                    [         R                  " / SQ5      n[        USSS9u  p#UR                  S:X  d   e[	        US[         R
                  " U5      -  5        [        US   [         R                  " S/5      5        [        US	   [         R                  " S
/5      5        [        US   [         R                  " S/5      5        [        US   [         R                  " S/5      5        g)z!
Test width condition for peaks.
)	r)   r   r)   r   r)   r   r9   rg   r   r[  r,  )rl  r1  r)   rl   r#  g?rf  rx   rc  g@rd  g      @N)r   rQ   r   r   r   r  r   r   r}  s       r%   test_width_condition"TestFindPeaks.test_width_condition  s     HH12!!9FzzQqe!445hTF);<o.

B40@Aj)2::se+<=k*BJJv,>?r'   c                     Sn/ SQn[        UXXS9u  p4[        U5      [        U R                  5      :X  d   eU R                   H!  nUR                  XE   R                  :X  a  M!   e   g)z
Test returned properties.
rZ  )
r   r)   r   r   r-  r   rb   r   ro   rp   rj  N)r   r+   rm  r   )rU   rn  rV   r   ro  rp  s         r%   test_propertiesTestFindPeaks.test_properties  sj     %,!!)6-:Q 5zS!3!34444%%C::000 &r'   c                    [        [        SS9   [        [        R                  " S5      5        SSS5        [        [        SS9   [        [        R
                  " S5      5        SSS5        [        [        SS9   [        [        R                  " S5      SS	9  SSS5        g! , (       d  f       Nz= f! , (       d  f       NU= f! , (       d  f       g= f)
z%
Test exceptions raised by function.
r  r   r)   NrM  r  r`   r9   r  )r   r=   r   r   rQ   r   r   r   s    r%   test_raisesTestFindPeaks.test_raises  s}     Jk2rxx{# 3Jk2rwwv' 3Jj1ryy}r2 21	 322211s#    B# B4;C#
B14
C
Cz(ignore:some peaks have a prominence of 0r%  c                 z   [        / SQSSSS9u  p[        US[        R                  " U5      -  5        [        US   [        R                  " US   5      5        [        US   [        R                  " US   5      5        [        US   [        R                  " US   5      5        S H  n[        X#   US	S
9  M     g)z
Test behavior of prominence and width calculation if the given window
length is smaller than a peak's plateau size.

Regression test for gh-9110.
r  rZ  r   )r0  rl  r
  rN  r#  rf  )rO  rP  rc  rd  FrO   N)r   r   r   r  r  )rU   r   ro  rp  s       r%   test_wlen_smaller_plateau'TestFindPeaks.test_wlen_smaller_plateau  s     "/l(41>q2<<#667m,bmmE-<P.QRhuX)GHo.U?=S0TUICEJ5A Jr'   kwargsr  ry   r0  rZ  rl  r[  c                     [         R                  " SSS5      nUR                  5       nSUR                  l        [        U5      u  pE[        U40 UD6u  pe[        XF5        g)z$
Test readonly arrays are accepted.
r   r`      FN)r   r,   r:   flags	writeabler   r   )rU   r  rV   
x_readonlyr   _peaks_readonlys          r%   test_readonly_array!TestFindPeaks.test_readonly_array  sT     KK2r"VVX
%*
"a=&z<V<.r'   r   N)r   r   r   r   rm  rq  ry  r~  r  r  r  r  r  r  r   r   rX  r  r   r  r   r   r'   r%   rb  rb  e  s    ?M
(+:+ +(?4+*@1	3 [[ J EGBGB  [[X
	S	|$	)	( //r'   rb  c                   8    \ rS rSrS rS rS rS rS rS r	Sr
g	)
TestFindPeaksCwti4  c                     / SQnSn[        X5      u  p4[        R                  " S[        U5      5      n[	        X5SSSS9n[        XdSS	S
9  g)zH
Generate a series of gaussians and attempt to find the peak locations.
rz   ry   r   g      4@r   g      I@r   r   r   r   N)
gap_threshmin_snr
min_lengthFz4Found maximum locations did not equal those expected)rP   err_msg)r0   r   r   r3   r   r   )rU   r   
num_pointsr   r   r#  
found_locss          r%   test_find_peaks_exact&TestFindPeaksCwt.test_find_peaks_exact6  sR     4
1&E	3F,#I!Q48:

$) V	
r'   c                    / SQnSn[        X5      u  p4[        R                  " S[        U5      5      nSn[        R                  R                  S5        U[        R                  R                  U5      S-
  SU-  -  -  n[        X5SS	US
-  S9nSn[        U5      [        U5      :X  d   U5       e[        R                  " Xt-
  5      n	[        R                  " U5      S
-  n
[        R                  R                  XSSU
 3-   5        g)zb
Verify that peak locations are (approximately) found
for a series of gaussians with added noise.
r  r   r   gQ?or*  r   r  r)   ro   )r  r  r  z-Different number of peaks found than expectedzMaximum location differedzby more than N)r0   r   r   r3   randomseedrandr   r+   r   rQ   r   r   )rU   r   r  r   r   r#  	noise_ampr  r  diffs	max_diffss              r%   test_find_peaks_withnoise*TestFindPeaksCwt.test_find_peaks_withnoiseE  s    
 4
1&E	3F,	
		x biinnZ0369EE	#I"45y1}N
 A:#h-/88/z,-HHV$q(	


$$U7R'4YK%@8A 	Br'   c                     SnSn[         R                  R                  S5      nUR                  U5      S-
  SU-  -  n[         R                  " SS5      n[        XESS	S
9n[        U5      S:X  d   eg)z9
Verify that no peak is found in
data that's just noise.
rx   rZ   iW
r*  r   r`   ra   ro   r   )r  
noise_percr   N)r   r  RandomStater  r   r   r+   )rU   r  r  rngr   r#  r  s          r%   test_find_peaks_nopeak'TestFindPeaksCwt.test_find_peaks_nopeak[  sn    
 	
ii##I.XXj)C/!I+>	2r"#IqRP
:!###r'   c                     [        SS5      n[        R                  " / SQ5      n[        X[         S9n[	        U[        R
                  " S/5      SS9  g )N   r   )r)   r   rb   rg   )waveletrZ   FrO   )r   r   rQ   r   r   r   )rU   rV   r#  as       r%   )test_find_peaks_with_non_default_wavelets:TestFindPeaksCwt.test_find_peaks_with_non_default_waveletsh  s?    S!,'1h72::se,%@r'   c           	         SS/nSn[        X5      u  p4[        R                  " S[        U5      S5      nSn[        R                  R                  S5      nX7R                  U5      S-
  SU-  -  -  nUS	S
=== S-  sss& [        X5SSSSS9n[        R                  " [        5         UR                  UR                  :X  d   e SSS5        [        X5SSSSS9nUR                  UR                  :X  d   eg! , (       d  f       N8= f)zY
Verify that window_size is passed correctly to private function and
affects the result.
r   r  r   g?皙?r  r*  r      i@  r)   rb   N)r  r  r  window_sizerr   )r0   r   r   r3   r  r  r  r   r   r   AssertionErrorr   )	rU   r   r  r   r   r#  r  r  r  s	            r%   test_find_peaks_window_size,TestFindPeaksCwt.test_find_peaks_window_sizeo  s    
 s
1&E	3FS1	ii##H-hhz*S01Y;??	 	#ca#I!Q/3G
]]>*??hmm333 + $I!Q/3E
(--/// +*s   'C77
Dc                     [         R                  " S[         R                  S5      n[         R                  " U5      nSn[	        X#5      n[         R
                  R                  US5        g)zE
Verify that the `width` argument
in `find_peaks_cwt` can be a float
r   r  r)       N)r   r   pisinr   r   assert_equal)rU   xsr   r#  r  s        r%   test_find_peaks_with_one_width/TestFindPeaksCwt.test_find_peaks_with_one_width  sJ    
 YYq"%%&FF2J	#I6




B/r'   r   N)r   r   r   r   r  r  r  r  r  r  r   r   r'   r%   r  r  4  s"    
B,$A04
0r'   r  )"r:   numpyr   r   r   r   scipy._lib._array_apir   r   scipy.signal._peak_findingr   r   r	   r
   r   r   r   r   scipy.signal.windowsr    scipy.signal._peak_finding_utilsr   r   r&   r0   rJ   rL   r   r   r   r  r`  rb  r  r   r'   r%   <module>r     s         B	 	 	 * R!($V8# 8#v_I _IDPL PLfx; x;vI6 I6XH8L/ L/^_0 _0r'   