
    tKgG                     ,   d dl Z d dlZd dlmZmZmZmZ d dlZd dlm	Z	m
Z
 d dlmZmZmZmZmZmZmZmZ d dlmZ d dlmZmZ d Zd Zd	 Z G d
 d      Z G d d      Z G d d      Z G d d      Z G d d      Z d Z! G d d      Z" G d d      Z#y)    N)assert_assert_equalassert_allcloseassert_array_equal)raiseswarns)	argrelmax	argrelminpeak_prominencespeak_widths_unpack_condition_args
find_peaksfind_peaks_cwt_identify_ridge_lines)gaussian)_local_maxima_1dPeakPropertyWarningc                    t        j                  d|      j                  t              }t        j                  |t              }t        |      D ],  \  }}|| |   z
  |z  }|t        j                  |dz         z  }. |S )Nr   dtype   )nparangeastypefloatzeros	enumerateexp)center_locssigmastotal_lengthxdataout_dataindsigmatmps           h/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/scipy/signal/tests/test_peak_finding.py_gen_gaussiansr(      st    IIa&--e4ExxE2H'
U{3''50BFFS!V9%% ( O    c                     t        |       }||dz   z  }t        j                  |||z
  |      j                  t              }t        || |      }||fS )N   )num)lenr   linspacer   intr(   )r    r!   	num_peaksdeltar   r#   s         r'   _gen_gaussians_evenr2   $   sU    FIIM*E++e\E%9yIPPQTUKk6<@H[  r)   c                    d }t        j                  |      }t        j                  |      }t        j                  |dgt              }| |dddf<   |d   | d   z
  t        |      z
  }||k  rt        d      |t        |      z  dz
  }|t        |      z  dz
  }	t        d|      D ]  }
||
dz
  df   }||
dz
  df   dz   }|
|z  dk(  r't        |      dkD  r|d|
z  |j                         z  z  }|
|	z  dk(  r!t        |      dkD  r||j                         z  } |||d         } |||d         }||g||
ddf<    |dddf   |dddf   gS )	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                 6    t        | d      }t        ||      }|S )Nr   )maxmin)r,   max_valouts      r'   keep_boundsz$_gen_ridge_line.<locals>.keep_bounds:   s    #qk#w
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gapsr9   locsr!   dist_intgap_intr$   nextcolnextrows                r'   _gen_ridge_linerK   ,   sz   
 ==Di(I88VQKs+DDAJA;A.T:LfNOOI&*Hs4y 1$GQsQwz"sQwz"Q&(Nac)nq&8c	9==?22G'MQSY]txxz!Ggx{3gx{3)S!V   AJQT
##r)   c            	           e Zd Zd Zd Zd Zd Zej                  j                  d e
j                  g d       e
j                  g d       e
j                  g d      g      d	        Zd
 Zy)TestLocalMaxima1dc                     t        j                  g t         j                        }t        |      D ]8  }t	        |t        j                  g              t        |j                  du        : y)zTest with empty signal.r   N)r   arrayfloat64r   r   r   baseselfxrO   s      r'   
test_emptyzTestLocalMaxima1d.test_emptyY   sH    HHRrzz*%a(E-EJJ$&' )r)   c                     t        j                  dd      }t        |      D ]8  }t        |t        j                  g              t        |j                  du        : y)zTest with linear signal.r   d   N)r   r.   r   r   rO   r   rQ   rR   s      r'   test_linearzTestLocalMaxima1d.test_linear`   sD    KK3%a(E-EJJ$&' )r)   c                     t        j                  ddd      }|dddxx   dz  cc<   t        j                  ddd      }t        |      D ]%  }t	        ||       t        |j                  du        ' y)zTest with simple signal.
   2   r   N   r+   )r   r.   r   r   r   r   rQ   )rS   rT   expectedrO   s       r'   test_simplezTestLocalMaxima1d.test_simpleg   se    KKR$	!$Q$199QA&%a(E )EJJ$&'	 )r)   c                    t        j                  g d      }t        |      \  }}}t        |t        j                  g d             t        |t        j                  g d             t        |t        j                  g d             y)z+Test if flat maxima are detected correctly.)gr   r+   r   r   r   r   r]   r]   r]   gQ@   ra   ra   ra   rZ   rb   rb   rb   rb   rZ   )r   ra            )r   ra            )r      	         N)r   rO   r   r   )rS   rT   	midpoints
left_edgesright_edgess        r'   test_flat_maximaz"TestLocalMaxima1d.test_flat_maximar   sb    HH / 0-=a-@*	:{Y): ;<Z*;!<=["((+<"=>r)   rT   )      ?r   r   )      @r]   r   ra   ra   )      @ri   ri   r      rt   rt   c                     t        |      D ]8  }t        |t        j                  g              t	        |j
                  du        : y)z,Test if behavior on signal edges is correct.N)r   r   r   rO   r   rQ   rR   s      r'   test_signal_edgesz#TestLocalMaxima1d.test_signal_edges{   s6     &a(E-EJJ$&' )r)   c                    t        t        d      5  t        t        j                  d             ddd       t        t        d      5  t        t        j                  dt
                     ddd       t        t        d      5  t        d	d
g       ddd       t        t        d      5  t        d       ddd       y# 1 sw Y   xY w# 1 sw Y   bxY w# 1 sw Y   GxY w# 1 sw Y   yxY w)z,Test input validation and raised exceptions.zwrong number of dimensionsmatch)r+   r+   Nzexpected 'const float64_t'r+   r   listrq          @z'x' must not be None)r   r>   r   r   onesr/   	TypeErrorrS   s    r'   test_exceptionsz!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/   C
%CC/C(CCC%(C1N)__name__
__module____qualname__rU   rX   r_   rp   pytestmarkparametrizer   rO   rv   r    r)   r'   rM   rM   W   sq    ((	(? [[S!"'(# 
(
(	#r)   rM   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)TestRidgeLinesc                     t        j                  ddg      }t        |t        j                  dd      d      }t	        t        |      dk(         y )Nrl   rW   r   r+   r   r   r   r   fullr   r-   rS   	test_matrliness      r'   rU   zTestRidgeLines.test_empty   s<    HHb#Y'	%iQCE
a r)   c                 \   t        j                  ddg      }d|d<   t        |t        j                  dd      d      }t	        t        |      dk(         t        j                  ddg      }d|dddf<   t        |t        j                  dd      d      }t	        t        |      dk(         y )Nrl   rW   r+   )r   r[   r   r   r[   r   r   s      r'   test_minimalzTestRidgeLines.test_minimal   s    HHb#Y'		%%iQCE
a HHb#Y'		!A#r'%iQCE
a r)   c                 &   g d}g d}t        j                  ddg      dz   }d}t        ddg|j                  |||      }d	||d   |d	   f<   t        j                  dt        |            }t        ||t        |      d	z         }t        ||g       y )
Nr   r+   r   ri   )r   r+   r   r   r+   rl   r\   g-q=rd   r      r+   )r   r   rK   shaper   r5   r   r   )rS   rD   rE   r   rC   linemax_distancesidentified_liness           r'   test_single_passzTestRidgeLines.test_single_pass   s     	HHb"X&.	2w	DQ&'	$q'47"#C	N301>14TQ@ 	+dV4r)   c                 x   g d}g d}t        j                  ddg      }d}t        ddg|j                  |||      }d||d   |d   f<   d	}t        j                  d|      }t        ||t        |      dz         }t        t        |      d
k(         |D ]  }	t        j                  |	d         }
t         j                  j                  t        j                  |
      |       t        j                  |	d         }t         j                  j                  t        j                  |      t        |      dz           y )Nr   )r   r+   r   ra   rl   r\   rd   r   r   r+   r]   r   皙?)r   r   rK   r   r   r   r5   r   r-   difftestingassert_array_lessabs)rS   rD   rE   r   rC   r   max_distr   r   ilineadistsagapss               r'   test_single_bigdistz"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                 d   g d}d}g d}t        j                  ddg      }d}t        ddg|j                  |||      }d	||d   |d	   f<   d
}t        j                  d|      }t        |||      }	t        t        |	      dk(         |	D ]  }
t        j                  |
d	         }t         j                  j                  t        j                  |      |       t        j                  |
d         }t         j                  j                  t        j                  |      t        |      dz           y )Nr   r]   )r   ra   r   r+   rl   r\   rd   r   r   r+   rt   r   r   r   r   rK   r   r   r   r   r-   r   r   r   r   r5   rS   rD   max_gaprE   r   rC   r   r   r   r   r   r   r   s                r'   test_single_biggapz!TestRidgeLines.test_single_biggap   s     	HHb"X&	2w	DQ&'	$q'47"#H-0M7S$%*+%EWWU1X&FJJ((BGGE!H%EJJ((D	CH &r)   c                 b   dg}d}ddg}t        j                  ddg      }d}t        ddg|j                  |||      }d||d   |d   f<   d}t        j                  d|      }t        |||      }	t        t        |	      dk(         |	D ]  }
t        j                  |
d         }t         j                  j                  t        j                  |      |       t        j                  |
d         }t         j                  j                  t        j                  |      t        |      dz           y )	Nr   r+   r]   rt   r\      r   r   r   r   s                r'   test_single_biggapsz"TestRidgeLines.test_single_biggaps   s   C	1vHHb"X&	2w	DQ&'	$q'47"#H-0M7S$%*+%EWWU1X&FJJ((BGGE!H%EJJ((D	CH &r)   N)	r   r   r   rU   r   r   r   r   r   r   r)   r'   r   r      s#    !
	!5I,I*Ir)   r   c                   $    e Zd Zd Zd Zd Zd Zy)
TestArgrelc                    t        j                  g t              }t        j                  d      }t	        |      }t        t        |      d       t        |d   |       t        j                  d      }t	        |d      \  }}t        ||       t        ||       t	        |d      \  }}t        ||       t        ||       y )Nr   ri   r+   r   )r]   ri   axis)r   rO   r/   r   r
   r   r-   r   )rS   empty_arrayz1iz2rowcols          r'   rU   zTestArgrel.test_empty   s     hhr-XXa[bMSVQ1Q4-XXe_Ra(S3,3,Ra(S3,3,r)   c                    t        j                  g dg dg dg dg dg      }t        |d      \  }}t        j                  |      }t	        ||   g d       t	        ||   g d	       t        |d
      \  }}t        j                  |      }t	        ||   g d       t	        ||   g d       t        |d      \  }}t        j                  |      }t	        ||   g d       t	        ||   g d       t        |d
      \  }}t        j                  |      }t	        ||   g d       t	        ||   g d       y )N)r+   r   r   r]   r   )r   r+   r   r   r]   )r]   r   r+   r   r   )r   r]   r   r+   r   )r+   r   r]   r   r+   r   r   r+   r   r]   )ra   r   r+   r+   )r   r]   ra   )r]   r+   r   )r   rO   r	   argsortr   r
   )rS   rT   r   r   orders        r'   
test_basiczTestArgrel.test_basic  s   
 HHo%%%%	' ( QQ'S

3SZ+SZ+QQ'S

3SZ+SZ+QQ'S

3SZ+SZ+QQ'S

3SZ+SZ+r)   c                     d}g d}t        |d      \  }}||   dz  |||z   <   ||   dz  |||z
  <   t        ||d      d   }t        t        |      t        |      k(         t        ||k(  j	                                y )Nr   )rq   r{         $@rs   g      .@  gwJ?clip)r   moder   )r2   r	   r   r-   all)rS   r   r    	test_dataact_locsrel_max_locss         r'   test_highorderzTestArgrel.test_highorder+  s    ,1&#>	8&/&9'&A	(U"#&/&9'&A	(U"# %fEaHL!S]23)..01r)   c                    g d}t        |d      \  }}d}t        j                  dt        |            |z
  }t        j                  |||   g      }t        |dd      \  }}t        d|j                  d         D ]O  }	||	k(  }
t        t        ||
         t        |      k(         t        |||
   ||	z  z
  k(  j                                Q y )N)rq   r{   r   rW   rl   r   r+   )r   r   )
r2   r   r   r-   vstackr	   r?   r   r   r   )rS   r    r   r   
rot_factor	rot_rangetest_data_2rel_max_rowsrel_max_colsrwindss              r'   test_2d_gaussianszTestArgrel.test_2d_gaussians6  s    !1&#>	8
IIaY0:=	iiIi,@ AB%.{!%L"l;,,Q/0B B&DCT*+s8}<=X,t"4z"}"DEJJLM	 1r)   N)r   r   r   rU   r   r   r   r   r)   r'   r   r      s    -0,>	2Nr)   r   c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	TestPeakProminencesc                    t        g dg       }t        |t        j                  t        j                  t        j                  g      D ]5  \  }}t        |j                  dk(         t        |j                  |k(         7 t        g g       }t        |t        j                  t        j                  t        j                  g      D ]5  \  }}t        |j                  dk(         t        |j                  |k(         7 y)N
        Test if an empty array is returned if no peaks are provided.
        r   r   N)r   zipr   rP   intpr   sizer   )rS   r8   arrr   s       r'   rU   zTestPeakProminences.test_emptyG  s     y"-cBJJ#ABJCCHHM"CII&' C r2&cBJJ#ABJCCHHM"CII&' Cr)   c                 x   t        j                  g d      }t        j                  g d      }t        j                  g d      }t        j                  g d      }||   t        j                  ||   ||   gd      z
  }t        ||      }t	        |d   |       t	        |d   |       t	        |d   |       y	)
z
        Test if height of prominences is correctly calculated in signal with
        rising baseline (peak widths are 1 sample).
        )r:   333333?r   r+   皙	@g?g
ףp=
@g @)r+   r   ra   rt   )r   r   r   ri   )r]   r]   ri   rf   r   r   r+   r   N)r   rO   r5   r   r   )rS   rT   peakslbasesrbasespromsr8   s          r'   r   zTestPeakProminences.test_basicU  s     HH;<&,','%2661V9ai"8qAAq%(SVU#SVV$SVV$r)   c                 6   g d}g d}t        ||      \  }}}t        |g d       t        |g d       t        |g d       g d}t        j                  g d      }t        ||      \  }}}t        |g d       t        ||dz
         t        ||dz          y	)
z"
        Test edge cases.
        )r   r   r+   r   r+   r   r   r+   r]   ri   )r   r   r   )r   r   r   )rt   rt   rt   )r   r+   r   r+   r   r+   r   )r+   r+   r+   r+   N)r   r   r   rO   rS   rT   r   r   r   r   s         r'   test_edge_casesz#TestPeakProminences.test_edge_casesf  s    
 " 0E :vvUI&VY'VY' "# 0E :vvUI&VUQY'VUQY'r)   c                     t        j                  g dd      }t        j                  g dd      }t        |ddd   |ddd         \  }}}t        |g d       t        |g d       t        |g d       y):
        Test with non-C-contiguous input arrays.
        )irj   rj   r   r]   r+   r   )r+   r   ra   N)rj   rj   r   )r   r   r]   )r]   r]   ri   )r   repeatr   r   r   s         r'   test_non_contiguousz'TestPeakProminences.test_non_contiguousz  sf     II)1-		)Q' 03Q3ss DvvUI&VY'VY'r)   c                     g d}dg}t        t        ||      g d       dD ](  \  }}t        t        |||      d|z
  d|z   d|z
  g       * y)	zO
        Test if wlen actually shrinks the evaluation range correctly.
        )r   r+   r   r]   r+   r   r:   r]   )rr   r   rt   ))rc   r   )rf   r   )rt   r   )ri   r+   )r   r+   r]   r   )皙?r   rr   r   rt   N)r   r   )rS   rT   peakwlenr   s        r'   	test_wlenzTestPeakProminences.test_wlen  sX     #s%a.
;SGD!)!T48261q5!a%:PQ Tr)   c                 $   t        t        d      5  t        g dgddg       ddd       t        t        d      5  t        g dddgg       ddd       t        t        d      5  t        ddg       ddd       t        t        d	      5  t        g dg       ddd       d
D ]+  }t        t        d	      5  t        g d|g       ddd       - t        t        d      5  t        g dddg       ddd       t        t        d      5  t        t	        j
                  d      ddgd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)zA
        Verify that exceptions and warnings are raised.
        	1-D arrayrx   )r   r+   r+   r   r+   r   Nr]   r   not a valid index)ir:   r]     r+   r   r   cannot safely castr   ffffff@r   r[   ri   r   )r   r>   r   r}   r   r   )rS   ps     r'   r   z#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=E
(EE";E.&E:$F=E
EE"E+.E7	:FFc                     d}dD ]+  }t        t        |      5  t        g d|g       ddd       - t        t        |      5  t        g ddgd       ddd       y# 1 sw Y   cxY w# 1 sw Y   yxY w)	>
        Verify that appropriate warnings are raised.
        z!some peaks have a prominence of 0)r   r+   r   rx   r   Nr   r+   r+   r+   r   r   r   )r   r   r   )rS   msgr   s      r'   test_warningsz!TestPeakProminences.test_warnings  se     2A*#6 QD1 76  &c2_qc: 32 7622s   AA+A(	+A4N)
r   r   r   rU   r   r   r   r   r   r   r   r)   r'   r   r   E  s&    (%"((	(	R<<	;r)   r   c                       e Zd Zd Zej
                  j                  d      d        Zd Zd Z	d Z
d Zej
                  j                  d      d        Zy	)
TestPeakWidthsc                    t        g g       d   }t        t        |t        j                               t        |j                  d       t        g dg       d   }t        t        |t        j                               t        |j                  d       t        g g       }|D ];  }t        t        |t        j                               t        |j                  d       = y)r   r   r   N)r   r   
isinstancer   ndarrayr   r   )rS   widthsr8   r   s       r'   rU   zTestPeakWidths.test_empty  s     R$Q'
62::./V[[!$Y+A.
62::./V[[!$"b!CJsBJJ/01% r)   #ignore:some peaks have a width of 0c                     t        j                  g d      }d}dD ]P  \  }}}}t        |dg|      \  }}}	}
t        ||       t        |d||z  z
         t        |	|       t        |
|       R y)zk
        Test a simple use case with easy to verify results at different relative
        heights.
        )r+   r   r+   r   r+   r   r:   r   ))        r  rr   rr   )g      ?rq         @      @)      ?r{   r{         @)      ?rr         ?      @)rq   r  rq   rs   )r{   rs   rq         @)rr   rs   rq   r  r]   N)r   rO   r   r   )rS   rT   
prominence
rel_height
width_truelip_truerip_true
width_calcheightlip_calcrip_calcs              r'   r   zTestPeakWidths.test_basic  s~     HH+,
;
6J
Hh 6AA3
6$2J(J
3FA
Z(?$?@Hh/Hh/;
r)   c                     t        j                  g dd      }t        j                  dgd      }t        |ddd   |ddd         }t        |g d       y)r   )r   rW   r\   ra   r+   r]   N)r  K   r  r	  )r   r   r   r   )rS   rT   r   results       r'   r   z"TestPeakWidths.test_non_contiguous  sM     IIlA&		1#q!QssVU3Q3Z0V23r)   c                    t        t        d      5  t        t        j                  d      t        j
                  d             ddd       t        t        d      5  t        ddg       ddd       t        t        d      5  t        t        j                  d      t        j
                  dt        j                  	             ddd       t        t        d      5  t        t        j                  d      d       ddd       t        t        d
      5  t        t        j                  d      ddg       ddd       t        t        d
      5  t        g ddg       ddd       t        t        d      5  t        t        j                  d      ddg       ddd       t        t        d      5  t        g dddgd       ddd       t        t        d      5  t        g ddgd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   SxY w# 1 sw Y   'xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)zD
        Verify that argument validation works as intended.
        r   rx   )r]   ra   r]   Nr   r[   r   r   r   rc   rg   r+   r   r   r   r   r  )r   r+   r   r+   r   r:   r  None)r+   r   r+   )NNNprominence_data)	r   r>   r   r   r   r|   r   r   r}   r~   s    r'   r   z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   3G?HAH! H&"H3H?="I8I$I#?H	HH#&H03H<?III #I,c                    d}t        t        |      5  t        g ddgd       ddd       t        t        |      5  t        g dd	gt        j                  d
gt        j
                        t        j                  d	gt        j                        t        j                  d	gt        j                        f       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)r   zsome peaks have a width of 0rx   r   r+   r   r+   r   r  Nr   r   r  r  )r   r   r   r   rO   rP   r   )rS   r   s     r'   r   z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   CA>CCCc                    g d}dg}t        g d      D ]  \  }\  }}}t        j                  |t        j                        t        j                  |t        j                        t        j                  |t        j                        f}|dk  rd}nd}t        t        |      5  t        |||	       d
d
d
        y
# 1 sw Y   xY w)z4Test with mismatching peak and / or prominence data.r  r+   ))rq   )r:   r   )r   r   )r]   )r   r!  r"  )rq   rq   r   r   r   r   )r#  r"  r!  )r   r$  r!  )r   r"  r%  r   r]   z#prominence data is invalid for peakz4arrays in `prominence_data` must have the same shaperx   r  N)r   r   rO   rP   r   r   r>   r   )	rS   rT   r   r   prominences
left_basesright_basesr  ry   s	            r'    test_mismatching_prominence_dataz/TestPeakWidths.test_mismatching_prominence_data  s    s9B D
 :5A5Z  "xx2::F!xx
"''B!xx277CEO 1u=N
%0At_E 10%:$ 10s   (CC	c                 x    g d}t        t        |dgd      g d       t        t        |dgd      g d       y)	z3Test if x == eval_height counts as an intersection.)r   r+   r   r+   r]   r]   r]   r+   r   r+   r   ri   r   )r   r  ))r  rr   rs   r,  gUUUUUU?))r  r   r+  )g      @N)r   r   )rS   rT   s     r'   test_intersection_rulesz&TestPeakWidths.test_intersection_rules6  s;     .AaSQ?4	6 	AaSSA4	6r)   N)r   r   r   rU   r   r   filterwarningsr   r   r   r   r)  r-  r   r)   r'   r   r     sh    & [[ EF0 G0.4L@"F2 [[ EF	6 G	6r)   r   c                     t        j                  d      } | }|dz   }|ddd   }t        dt        d| |      k(         t        dt        d| |      k(         t        dt        d| |      k(         t        dt        d| |      k(         t        dt        d| |      k(         t        ||f| |      \  }}t	        |||          t	        |||          t        t        d	
      5  t        |t        j                  d      |       ddd       t        t        d
      5  t        d|ft        j                  d      |       ddd       y# 1 sw Y   FxY w# 1 sw Y   yxY w)zW
    Verify parsing of condition arguments for `scipy.signal.find_peaks` function.
    r[   r+   Nr   NN)r+   NNr   )rr   r
  zarray size of lowerrx   rg   zarray size of upper)r   r   r   r   r   r   r>   )rT   	amin_true	amax_truer   	amin_calc	amax_calcs         r'   test_unpack_condition_argsr6  C  s=    			"AIBIaddOE L2<EJJKI/1e<<=I/	1eDDEI/	1eDDEI/	1eDDE 29i2H!USIyIe,-Ie,- 

"7	8y"))B-? 
9	
"7	8i0"))B-G 
9	8 
9	8	8	8s   #!E	#E	EEc                       e Zd Zh dZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zej                  j                  dd      d        Zej                  j#                  di ddiddiddig      d        Zy)TestFindPeaks>
   r   left_ips	right_ipsr'  r&  r(  peak_heightswidth_heightsleft_thresholdsright_thresholdsc                     d}t        t        j                  d      ||||      \  }}t        |j                  dk(         | j
                  D ]  }t        ||   j                  dk(          y)z@
        Test behavior for signal without local maxima.
        r0  r[   r  	thresholdr  widthr   N)r   r   r|   r   r   property_keys)rS   open_intervalr   propskeys        r'   test_constantzTestFindPeaks.test_constantf  sc     %!"''"+)6--:-Qu 	

a %%CE#JOOq() &r)   c                 z   t        j                  g d      }t        j                  |j                  dz  dz         }||ddd<   t        j                  |j                  t
              }|ddd   |ddd<   t        j                  ||      }t        |d      \  }}t        |g d       t        |d	   |       t        |d
   ||dz
  dz  z
         t        |d   ||dz  z          t        t        |d      d   g d       t        t        |d      d   g d       t        t        |d      d   ddg       y)z8
        Test plateau size condition for peaks.
        )r+   r   r]   ra   rc   rl   o   r   r+   Nr   r0  )plateau_size)r+   r]   rf   rg   re   !   rW   plateau_sizesrn   ro   ra   r   )rg   re   rK  rW   )Nr  )r+   r]   rf   )ri   r\   re   rK  )	r   rO   r   r   r|   r/   r   r   r   )rS   rL  rT   repeatsr   rE  s         r'   test_plateau_sizezTestFindPeaks.test_plateau_sizer  s)   
 !9:HH]''!+a/0!$Q$''!&&,!$Q$1IIa! "!,?uU67U?+];U<(%=13D2J*JKU=)5=A3E+EF 	Z2157HIZ<Q?KZ8;b"XFr)   c                    d}t        |d      \  }}t        |t        j                  g d             t        |d   t        j                  g d             t        t        |d      d   t        j                  d	d
g             t        t        |d      d   t        j                  dd	g             t        t        |d      d   t        j                  d	g             y)z2
        Test height condition for peaks.
        )r  UUUUUU?r  r  r   r  r   r0  )r  r   r;  )rP  r  r  r  r   r]   ri   )Nr]   r+   )r   r]   Nr   r   r   rO   rS   rT   r   rE  s       r'   test_height_conditionz#TestFindPeaks.test_height_condition  s     )!!L9uUBHHY/0U>*BHH^,DEZ#.q1288QF3CDZ)4Q71a&9IJZ&1!4bhhsmDr)   c                    d}t        |d      \  }}t        |t        j                  ddg             t        |d   t        j                  ddg             t        |d   t        j                  dd	g             t        t        |d      d
   t        j                  dg             t        t        |d      d
   t        j                  g              t        t        |d      d
   t        j                  ddg             t        t        |d      d
   t        j                  dg             t        t        |d      d
   t        j                  g              y)z5
        Test threshold condition for peaks.
        )r   r   r+   ra   r:   r0  )rA  r+   r]   r=  r   r>  ri   r   r  )Nri   )Nra   )r   ra   NrQ  rR  s       r'   test_threshold_conditionz&TestFindPeaks.test_threshold_condition  s	    !!|<uUBHHaV,-U,-rxxA/?@U-.!Q0@AZQ/2BHHaSMBZS1!4bhhrlCZY7:BHHaV<LMZY7:BHHaSMJZV4Q7"Fr)   c                    t        j                  ddd      }t        j                  d      }||xx   t        j                  dd|j                        z  cc<   t        t        |d      d   |       t        |d      d   }t        t        j                  ||d	      j                  dk(         t        t        j                  |      d
       g d}t        |d      d   }t        |j                  dk(  xr |d   dk(         y)z4
        Test distance condition for peaks.
        r+      r]   r   distancer   g9m4 @T)assume_uniquert   )r+   r:   r   r[   N)
r   r   r   r.   r   r   r   r   	setdiff1dr   )rS   	peaks_allrT   peaks_subsets       r'   test_distance_conditionz%TestFindPeaks.test_distance_condition  s    
 IIaQ'	HHRL	)Aq)..99 	ZA.q19= "!f5a8LLyEJJaO	
 	RWW\*A. !!b1!4!!Q&?<?a+?@r)   c                    t        j                  ddd      }t        j                  ddd      }t        j                  dd|j                        }||xx   |z  cc<   ||   ||dz      z
  }d}t        j                  |d   |k  ||d   k  z        }t        ||      \  }}t        |||          t        |d	   ||          t        |d
   d       t        |d   ||   dz          y)z6
        Test prominence condition for peaks.
        r   r[   rW   r+   c   r   )r]   rj   )r  r&  r'  r(  N)r   r.   r   r   nonzeror   r   )	rS   rT   
peaks_trueoffsetr&  intervalkeep
peaks_calc
propertiess	            r'   test_prominence_conditionz'TestFindPeaks.test_prominence_condition  s     KK2s#YYq"a(
QJOO4	*
ma
Q&77zza[K'K8A;,FGI ",A(!C
JZD!12Z.D0ABZ-q1Z.
40@10DEr)   c                    t        j                  g d      }t        |dd      \  }}t        |j                  d       t        |d       t        |d   d       t        |d	   d
       t        |d   d       t        |d   d       y)z1
        Test width condition for peaks.
        )	r+   r   r+   r   r+   r   r:   ra   r   r1  r  )rB  r  r+   rf   r   g?r<  rq   r9  g@r:  g      @N)r   rO   r   r   r   r   rR  s       r'   test_width_conditionz"TestFindPeaks.test_width_condition  sx     HH12!!9FuUZZ#UAh.o.3j)3/k*D1r)   c                     d}g d}t        |||||      \  }}t        t        |      t        | j                        k(         | j                  D ]'  }t        |j                  ||   j                  k(         ) y)z+
        Test returned properties.
        r0  )
r   r+   r   r   r	  r   r]   r   ri   rj   r@  N)r   r   r-   rC  r   )rS   rD  rT   r   rE  rF  s         r'   test_propertieszTestFindPeaks.test_properties  sp     %,!!)6--:-Qu 	E
c$"4"4556%%CEJJ%*//12 &r)   c                    t        t        d      5  t        t        j                  d             ddd       t        t        d      5  t        t        j
                  d             ddd       t        t        d      5  t        t        j                  d      d	       ddd       y# 1 sw Y   |xY w# 1 sw Y   PxY w# 1 sw Y   yxY w)
z5
        Test exceptions raised by function.
        r   rx   r+   Nr%  rY  r[   r:   rX  )r   r>   r   r   rO   r|   r   r~   s    r'   test_raisesz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,
B8!C,B58CCz(ignore:some peaks have a prominence of 0r  c                     t        g dddd      \  }}t        |d       t        |d   d       t        |d   d       t        |d   d	       d
D ]  }t        ||   |        y)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   r0  r   )r  rB  r   r&  r   r   r<  r+   )r'  r(  r9  r:  N)r   r   )rS   r   rE  rF  s       r'   test_wlen_smaller_plateauz'TestFindPeaks.test_wlen_smaller_plateau  sj     "/l(41>uUAU=)1-U8_a(U?+Q/ICsU+ Jr)   kwargsrY  rr   r  r0  rB  r1  c                     t        j                  ddd      }|j                         }d|j                  _        t        |      \  }}t        |fi |\  }}t        ||       y)z4
        Test readonly arrays are accepted.
        r   r[      FN)r   r.   r;   flags	writeabler   r   )rS   rs  rT   
x_readonlyr   _peaks_readonlys          r'   test_readonly_arrayz!TestFindPeaks.test_readonly_array	  sZ     KK2r"VVX
%*
"a=q&z<V<~.r)   N)r   r   r   rC  rG  rN  rS  rU  r`  rj  rl  rn  rp  r   r   r.  rr  r   r{  r   r)   r'   r8  r8  _  s    ?M
*G0
EGA4F&23	3 [[ J EG,G,  [[X
	S	|$	)	( //r)   r8  c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)TestFindPeaksCwtc                     g d}d}t        ||      \  }}t        j                  dt        |            }t	        ||ddd      }t        j
                  j                  ||d       y)	zX
        Generate a series of gaussians and attempt to find the peak locations.
        rs   rr   r   g      4@r   g      I@r   r   r   r   N)
gap_threshmin_snr
min_lengthz4Found maximum locations did not equal those expected)r2   r   r   r5   r   r   r   )rS   r    
num_pointsr   r   r   
found_locss          r'   test_find_peaks_exactz&TestFindPeaksCwt.test_find_peaks_exact   sb     4
1&*E	83F,#Iv!Q48:



%%j(N	Pr)   c                 >   g d}d}t        ||      \  }}t        j                  dt        |            }d}t        j                  j                  d       |t        j                  j                  |      dz
  d|z  z  z  }t        ||dd	|d
z        }t        j                  j                  t        |      t        |      d       t        j                  ||z
        }t        j                  |      d
z  }	t        j                  j                  ||	dd|	z  z          y)zz
        Verify that peak locations are (approximately) found
        for a series of gaussians with added noise.
        r  r   r   gQ?or  r   ru  r+   ri   )r  r  r  z,Different numberof peaks found than expectedzMaximum location differedzby more than %sN)r2   r   r   r5   randomseedrandr   r   r   r-   r   rO   r   )
rS   r    r  r   r   r   	noise_ampr  diffs	max_diffss
             r'   test_find_peaks_withnoisez*TestFindPeaksCwt.test_find_peaks_withnoise-  s    
 4
1&*E	83F,	
		x biinnZ0369EE	#Iv"45y1}N
 	

JX A? 	@zH,-HHV$q(	


$$UI7R%6)%D8E 	Fr)   c                 6   d}d}t         j                  j                  d       t         j                  j                  |      dz
  d|z  z  }t        j                  dd      }t        ||dd	
      }t         j                  j                  t        |      d       y)zQ
        Verify that no peak is found in
        data that's just noise.
        rq   rW   iW
r  r   r[   r\   ri   r   )r  
noise_percr   N)	r   r  r  r  r   r   r   r   r-   )rS   r  r  r   r   r  s         r'   test_find_peaks_nopeakz'TestFindPeaksCwt.test_find_peaks_nopeakC  sv    
 	

		y!YY^^J/#5)D	2r"#IvqRP



J3r)   c                     t        dd      }t        j                  g d      }t        ||t               }t        j                  j                  t        j                  dg      |       y )N   r   )r+   r   r]   ra   )waveletrW   )r   r   rO   r   r   r   )rS   rT   r   as       r'   )test_find_peaks_with_non_default_waveletsz:TestFindPeaksCwt.test_find_peaks_with_non_default_waveletsP  sH    S!,'1fh7


#3r)   c                 0   ddg}d}t        ||      \  }}t        j                  dt        |      d      }d}t        j                  j                  d       |t        j                  j                  |      dz
  d|z  z  z  }|d	d
xxx dz  ccc t        ||dddd      }t        j                  t              5  |j                  |j                  k(  sJ 	 ddd       t        ||dddd      }|j                  |j                  k(  sJ y# 1 sw Y   6xY w)zq
        Verify that window_size is passed correctly to private function and
        affects the result.
        r{   r   r   g?皙?r  r  r      i@  r+   r]   N)r  r  r  window_sizerl   )r2   r   r   r5   r  r  r  r   r   r   AssertionErrorr   )rS   r    r  r   r   r   r  r  s           r'   test_find_peaks_window_sizez,TestFindPeaksCwt.test_find_peaks_window_sizeW  s    
 s
1&*E	83FS1	
		x biinnZ0369EE	 	#ca#Iv!Q/3G
]]>*??hmm333 + $Iv!Q/3E
(--/// +*s   :DDc                     t        j                  dt         j                  d      }t        j                  |      }d}t	        ||      }t         j
                  j                  |d       y)z]
        Verify that the `width` argument
        in `find_peaks_cwt` can be a float
        r   r  r+       N)r   r   pisinr   r   r   )rS   xsr   r   r  s        r'   test_find_peaks_with_one_widthz/TestFindPeaksCwt.test_find_peaks_with_one_widthq  sL    
 YYq"%%&FF2J	#Iv6




B/r)   N)	r   r   r   r  r  r  r  r  r  r   r)   r'   r}  r}    s"    PF,4404
0r)   r}  )$r;   numpyr   numpy.testingr   r   r   r   r   r   r   scipy.signal._peak_findingr	   r
   r   r   r   r   r   r   scipy.signal.windowsr    scipy.signal._peak_finding_utilsr   r   r(   r2   rK   rM   r   r   r   r   r6  r8  r}  r   r)   r'   <module>r     s         	 	 	 * R!($V8# 8#v]I ]I@PN PNfr; r;jF6 F6RH8|/ |/~]0 ]0r)   