o
    h                     @   s  d dl Z d dlZd dlZd dlmZm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d Zd	d
 Zdd ZG dd dZG dd dZG dd dZG dd dZG dd dZdd ZG dd dZ G dd dZ!dS )    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                 C   sZ   t d|t}t j|td}t|D ]\}}|| |  | }|t |d  7 }q|S )Nr   dtype   )nparangeastypefloatzeros	enumerateexp)center_locssigmastotal_lengthxdataout_dataindsigmatmp r#   X/var/www/vscode/kcb/lib/python3.10/site-packages/scipy/signal/tests/test_peak_finding.py_gen_gaussians   s   r%   c                 C   sB   t | }||d  }tj||| |dt}t|| |}||fS )N   )num)lenr   linspacer   intr%   )r   r   	num_peaksdeltar   r   r#   r#   r$   _gen_gaussians_even   s
   r-   c                 C   sZ  dd }t |}t |}tj|dgtd}| |dddf< |d | d  t| }||k r3td|t| d }|t| d }	td|D ]T}
||
d df }||
d df d }|
| dkrrt|dkrr|d	|
 |	  7 }|
|	 dkrt|dkr||	 7 }|||d }|||d }||g||
ddf< qH|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                 S   s   t | d}t||}|S )Nr   )maxmin)r'   max_valoutr#   r#   r$   keep_bounds5   s   

z$_gen_ridge_line.<locals>.keep_boundsr   r   r   Nz3Cannot generate ridge line according to constraintsr&   )
copydeepcopyr   r   r*   sum
ValueErrorr(   rangepop)
start_locsmax_locslength	distancesgapsr2   locsr   dist_intgap_intr    nextcolnextrowr#   r#   r$   _gen_ridge_line'   s*   

 rD   c                	   @   sn   e Zd Zdd Zdd Zdd Zdd Zej	d	e
g d
e
g de
g dgdd Zdd ZdS )TestLocalMaxima1dc                 C   sD   t jg t jd}t|D ]}t|t g dd |jdu sJ qdS )zTest with empty signal.r   Fcheck_dtypeN)r   arrayfloat64r   r   baseselfxrH   r#   r#   r$   
test_emptyT   s
   zTestLocalMaxima1d.test_emptyc                 C   sB   t dd}t|D ]}t|t jg t jd |jdu sJ q
dS )zTest with linear signal.r   d   r   N)r   r)   r   r   rH   intprJ   rK   r#   r#   r$   test_linear[   s
   zTestLocalMaxima1d.test_linearc                 C   sf   t ddd}|ddd  d7  < t jdddt jd}t|D ]}t||d	d
 |jdu s0J q dS )zTest with simple signal.
   2   r   N   r&   r   FrF   )r   r)   r   rP   r   r   rJ   )rL   rM   expectedrH   r#   r#   r$   test_simpleb   s   zTestLocalMaxima1d.test_simplec                 C   sh   t g d}t|\}}}t|t g ddd t|t g ddd t|t g ddd dS )z+Test if flat maxima are detected correctly.)gr   r&   r   r   r   r   rU   rU   rU   gQ@   rX   rX   rX   rR   rY   rY   rY   rY   rR   )r   rX            FrF   )r   rX            )r      	         N)r   rH   r   r   )rL   rM   	midpoints
left_edgesright_edgesr#   r#   r$   test_flat_maximam   s
   z"TestLocalMaxima1d.test_flat_maximarM   )      ?r   r   )      @rU   r   rX   rX   )      @r`   r`   r      rk   rk   c                 C   s6   t |D ]}t|tjg tjd |jdu sJ qdS )z,Test if behavior on signal edges is correct.r   N)r   r   r   rH   rP   rJ   rK   r#   r#   r$   test_signal_edgesv   s   z#TestLocalMaxima1d.test_signal_edgesc                 C   s   t tdd ttd W d   n1 sw   Y  t tdd ttjdtd W d   n1 s7w   Y  t tdd td	d
g W d   n1 sSw   Y  t tdd td W d   dS 1 snw   Y  dS )z,Test input validation and raised exceptions.zwrong number of dimensionsmatch)r&   r&   Nzexpected 'const float64_t'r&   r   listrh          @z'x' must not be None)r   r7   r   r   onesr*   	TypeErrorrL   r#   r#   r$   test_exceptions   s   
"z!TestLocalMaxima1d.test_exceptionsN)__name__
__module____qualname__rN   rQ   rW   rg   pytestmarkparametrizer   rH   rl   rt   r#   r#   r#   r$   rE   R   s    	
rE   c                   @   <   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )TestRidgeLinesc                 C   s6   t ddg}t|t ddd}t|dksJ d S )Nrc   rO   r   r&   r   r   r   r   fullr(   rL   	test_matrlinesr#   r#   r$   rN      s   zTestRidgeLines.test_emptyc                 C   s   t ddg}d|d< t|t ddd}t|dksJ t ddg}d|dddf< t|t ddd}t|dks>J d S )Nrc   rO   r&   )r   rS   r   r   rS   r}   r   r#   r#   r$   test_minimal   s   zTestRidgeLines.test_minimalc           
      C   s   g d}g d}t ddgd }d}tddg|j|||}d	||d |d	 f< t dt|}t||t|d	 }t|d	ksBJ t|d |D ]\}}	t	||	d
d qId S )Nr   r&   r   r`   )r   r&   r   r   r&   rc   rT   g-q=r[   r      r&   FrF   )
r   r   rD   shaper~   r.   r   r(   zipr   )
rL   r=   r>   r   r<   linemax_distancesidentified_linesiline_line_r#   r#   r$   test_single_pass   s   
zTestRidgeLines.test_single_passc                 C   s   g d}g d}t ddg}d}tddg|j|||}d||d |d f< d	}t d|}t||t|d }t|d
ks@J |D ](}	t |	d }
t j	
t |
| t |	d }t j	
t |t|d  qBd S )Nr   )r   r&   r   rX   rc   rT   r[   r   r   r&   rU   r   皙?)r   r   rD   r   r~   r   r.   r(   difftestingassert_array_lessabs)rL   r=   r>   r   r<   r   max_distr   r   ilineadistsagapsr#   r#   r$   test_single_bigdist   s&   
z"TestRidgeLines.test_single_bigdistc                 C   s   g d}d}g d}t ddg}d}tddg|j|||}d	||d |d	 f< d
}t d|}t|||}	t|	dks>J |	D ](}
t |
d	 }t j	t 
|| t |
d }t j	t 
|t|d  q@d S )Nr   rU   )r   rX   r   r&   rc   rT   r[   r   r   r&   rk   r   r   r   r   rD   r   r~   r   r(   r   r   r   r   r.   rL   r=   max_gapr>   r   r<   r   r   r   r   r   r   r   r#   r#   r$   test_single_biggap   s"   z!TestRidgeLines.test_single_biggapc                 C   s   dg}d}ddg}t ddg}d}tddg|j|||}d||d |d f< d}t d|}t|||}	t|	dks=J |	D ](}
t |
d }t j	t 
|| t |
d }t j	t 
|t|d  q?d S )	Nr   r&   rU   rk   rT      r   r   r   r   r#   r#   r$   test_single_biggaps   s"   z"TestRidgeLines.test_single_biggapsN)	ru   rv   rw   rN   r   r   r   r   r   r#   r#   r#   r$   r|      s    r|   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )

TestArgrelc                 C   s   t jg td}t d}t|}tt|d t|d |dd t d}t|dd\}}t||dd t||dd t|dd\}}t||dd t||dd d S )	Nr   r`   r&   r   FrF   )rU   r`   axis)r   rH   r*   r   r   r   r(   )rL   empty_arrayz1iz2rowcolr#   r#   r$   rN      s   

zTestArgrel.test_emptyc                 C   sD  t g dg dg dg dg dg}t|dd\}}t |}t|| g dd	d
 t|| g dd	d
 t|dd\}}t |}t|| g dd	d
 t|| g dd	d
 t|dd\}}t |}t|| g dd	d
 t|| g dd	d
 t|dd\}}t |}t|| g dd	d
 t|| g dd	d
 d S )N)r&   r   r   rU   r   )r   r&   r   r   rU   )rU   r   r&   r   r   )r   rU   r   r&   r   )r&   r   rU   r   r&   r   r   r&   r   rU   FrF   )rX   r   r&   r&   )r   rU   rX   )rU   r&   r   )r   rH   r   argsortr   r   )rL   rM   r   r   orderr#   r#   r$   
test_basic	  s,   




zTestArgrel.test_basicc                 C   s|   d}g d}t |d\}}|| d ||| < || d ||| < t||ddd }t|t|ks4J ||k s<J d S )Nr   )rh   rp         $@rj   g      .@  gwJ?clip)r   moder   )r-   r   r(   all)rL   r   r   	test_dataact_locsrel_max_locsr#   r#   r$   test_highorder(  s   zTestArgrel.test_highorderc                 C   s   g d}t |d\}}d}tdt|| }t||| g}t|ddd\}}td|jd D ] }	||	k}
t||
 t|ksCJ |||
 ||	  k sQJ q1d S )N)rh   rp   r   rO   rc   r   r&   )r   r   )	r-   r   r   r(   vstackr   r8   r   r   )rL   r   r   r   
rot_factor	rot_rangetest_data_2rel_max_rowsrel_max_colsrwindsr#   r#   r$   test_2d_gaussians3  s   zTestArgrel.test_2d_gaussiansN)ru   rv   rw   rN   r   r   r   r#   r#   r#   r$   r      s
    r   c                   @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Ze	j
jdd ZdS )TestPeakProminencesc                 C   s   t g dg }t|tjtjtjgD ]\}}|jdksJ |j|ks$J qt g g }t|tjtjtjgD ]\}}|jdks@J |j|ksGJ q5dS )N
        Test if an empty array is returned if no peaks are provided.
        r   r   N)r   r   r   rI   rP   sizer   )rL   r1   arrr   r#   r#   r$   rN   D  s   
zTestPeakProminences.test_emptyc                 C   s   t g d}t g d}t g d}t g d}|| t j|| || gdd }t||}t|d |dd t|d	 |dd t|d
 |dd dS )z
        Test if height of prominences is correctly calculated in signal with
        rising baseline (peak widths are 1 sample).
        )r3   333333?r   r&   皙	@g?g
ףp=
@g @)r&   r   rX   rk   )r   r   r   r`   )rU   rU   r`   r]   r   r   FrF   r&   r   N)r   rH   r.   r   r   )rL   rM   peakslbasesrbasespromsr1   r#   r#   r$   r   R  s   "
zTestPeakProminences.test_basicc                 C   s   g d}g d}t ||\}}}t|tg ddd t|g ddd t|g ddd g d}tg d}t ||\}}}t|tg d	 t||d
 dd t||d
 dd dS )z"
        Test edge cases.
        )r   r   r&   r   r&   r   r   r&   rU   r`   )rp   r   r   FrF   )r   r   r   )rk   rk   rk   )r   r&   r   r&   r   r&   r   )rh   r&   r&   r&   N)r   r   r   asarrayrH   rL   rM   r   r   r   r   r#   r#   r$   test_edge_casesc  s   z#TestPeakProminences.test_edge_casesc                 C   s   t g dd}t g dd}t|ddd |ddd \}}}t|t g d t|g ddd t|g d	dd dS )
:
        Test with non-C-contiguous input arrays.
        )ira   ra   r   rU   r&   r   )r&   r   rX   N)g      "@ra   r   )r   r   rU   FrF   )rU   rU   r`   )r   repeatr   r   r   r   r#   r#   r$   test_non_contiguousw  s   $z'TestPeakProminences.test_non_contiguousc                 C   s   g d}dg}t ||}t|g dD ]
\}}||ksJ qdD ]#\}}t |||}t|d| d| d| gD ]
\}}||ksBJ q8q dS )	zO
        Test if wlen actually shrinks the evaluation range correctly.
        )r   r&   r   rU   r&   r   r3   rU   )ri   r   rk   ))rZ   r   )r]   r   )rk   r   )r`   r&   )r   r&   rU   r   )皙?r   ri   r   rk   N)r   r   )rL   rM   peakr   promvalwlenr   r#   r#   r$   	test_wlen  s   
$zTestPeakProminences.test_wlenc              	   C   s  t tdd tg dgddg W d   n1 sw   Y  t tdd tg dddgg W d   n1 s;w   Y  t tdd tddg W d   n1 sWw   Y  t td	d tg dg W d   n1 ssw   Y  d
D ] }t td	d tg d|g W d   n1 sw   Y  qzt tdd tg dddg W d   n1 sw   Y  t tdd ttdddgdd W d   dS 1 sw   Y  dS )zA
        Verify that exceptions and warnings are raised.
        	1-D arrayrm   )r   r&   r&   r   r&   r   NrU   r   not a valid index)ir3   rU     r&   r   r   cannot safely castr   ffffff@r   rS   r`   r   )r   r7   r   rr   r   r   )rL   pr#   r#   r$   rt     s.   "z#TestPeakProminences.test_exceptionsc              	   C   s   d}dD ] }t t|d tg d|g W d   n1 sw   Y  qt t|d tg ddgdd W d   dS 1 sAw   Y  dS )	>
        Verify that appropriate warnings are raised.
        z!some peaks have a prominence of 0)r   r&   r   rm   r   Nr   r&   r&   r&   r   r   r   )r   r   r   )rL   msgr   r#   r#   r$   test_warnings  s   "z!TestPeakProminences.test_warningsN)ru   rv   rw   rN   r   r   r   r   rt   rx   ry   thread_unsafer   r#   r#   r#   r$   r   B  s    r   c                   @   sd   e Zd Zdd Zejddd Zdd Zdd	 Z	ejj
d
d Zdd Zejddd ZdS )TestPeakWidthsc                 C   s   t g g d }t|tjsJ |jdksJ t g dg d }t|tjs'J |jdks.J t g g }|D ]}t|tjs?J |jdksFJ q5dS )r   r   r   N)r	   
isinstancer   ndarrayr   )rL   widthsr1   r   r#   r#   r$   rN     s   
zTestPeakWidths.test_empty#ignore:some peaks have a width of 0c                 C   s   t g d}d}dD ]9\}}}}t|dg|\}}}	}
t|t |g t|t d||  g t|	t |g t|
t |g qdS )zk
        Test a simple use case with easy to verify results at different relative
        heights.
        )r&   r   r&   r   r&   r   r3   r   ))        r   ri   ri   )g      ?rh         @      @)      ?rp   rp         @)      ?ri         ?      @)rh   r   rh   rj   )rp   rj   rh         @)ri   rj   rh   r   rU   N)r   rH   r	   r   r   )rL   rM   
prominence
rel_height
width_truelip_truerip_true
width_calcheightlip_calcrip_calcr#   r#   r$   r     s   	zTestPeakWidths.test_basicc                 C   s`   t g dd}t dgd}t|ddd |ddd }t|t dgdgdgdgg dS )	r   )r   rO   rT   rX   r&   rU   Nr   K   r   )r   r   r	   r   r   )rL   rM   r   resultr#   r#   r$   r     s   z"TestPeakWidths.test_non_contiguousc                 C   sB  t tdd ttdtd W d   n1 sw   Y  t tdd tddg W d   n1 s8w   Y  t tdd ttdtjdtjd	 W d   n1 s\w   Y  t tdd ttdd W d   n1 szw   Y  t td
d ttdddg W d   n1 sw   Y  t td
d tg ddg W d   n1 sw   Y  t tdd ttdddg W d   n1 sw   Y  t tdd tg dddgdd W d   n1 sw   Y  t tdd tg ddgdd W d   dS 1 sw   Y  dS )zD
        Verify that argument validation works as intended.
        r   rm   )rU   rX   rU   Nr   rS   r   r   r   rZ   r^   r&   r   r   r   r   r   )r   r&   r   r&   r   r3   r   None)r&   r   r&   )NNNprominence_data)	r   r7   r	   r   r   rq   r   rP   rr   rs   r#   r#   r$   rt     s6   $zTestPeakWidths.test_exceptionsc              
   C   s   d}t t|d tg ddgdd W d   n1 sw   Y  t t|d( tg dd	gtd
gtjtd	gtjtd	gtjfd W d   dS 1 sSw   Y  dS )r   zsome peaks have a width of 0rm   r   r&   r   r&   r   r   Nr   r   r   r   )r   r   r	   r   rH   rI   rP   )rL   r   r#   r#   r$   r     s   
"zTestPeakWidths.test_warningsc           	   	   C   s   g d}dg}t g dD ]D\}\}}}tj|tjdtj|tjdtj|tjdf}|dk r2d}nd}tt|d t|||d	 W d
   n1 sLw   Y  qd
S )z4Test with mismatching peak and / or prominence data.r   r&   ))rh   )r3   r   )r   r   )rU   )r   r   r  )rh   rh   r   r   r   r   )r  r  r   )r   r  r   )r   r  r  r   rU   z#prominence data is invalid for peakz4arrays in `prominence_data` must have the same shaperm   r   N)r   r   rH   rI   rP   r   r7   r	   )	rL   rM   r   r   prominences
left_basesright_basesr   rn   r#   r#   r$    test_mismatching_prominence_data#  s   
z/TestPeakWidths.test_mismatching_prominence_datac                 C   s@   g d}t t|dgddg d t t|dgddg d dS )	z3Test if x == eval_height counts as an intersection.)r   r&   r   r&   rU   rU   rU   r&   r   r&   r   r`   r   )r   r   ))r   ri   rj   r
  gUUUUUU?))r   r   r	  )g      @N)r   r	   )rL   rM   r#   r#   r$   test_intersection_rules<  s   z&TestPeakWidths.test_intersection_rulesN)ru   rv   rw   rN   rx   ry   filterwarningsr   r   rt   r   r   r  r  r#   r#   r#   r$   r     s    

 

r   c                  C   s>  t d} | }|d }|ddd }dtd| |ksJ dtd| |ks&J dtd| |ks0J dtd| |ks:J dtd| |ksDJ t||f| |\}}t|||  t|||  ttd	d
 t|t d| W d   n1 svw   Y  ttdd
 td|ft d| W d   dS 1 sw   Y  dS )zW
    Verify parsing of condition arguments for `scipy.signal.find_peaks` function.
    rS   r&   Nr   NN)r&   NNr   )ri   r   zarray size of lowerrm   r^   zarray size of upper)r   r   r
   r   r   r7   )rM   	amin_true	amax_truer   	amin_calc	amax_calcr#   r#   r$   test_unpack_condition_argsI  s$   
"r  c                   @   s   e Zd Zh dZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zejdddd Zejdi ddiddiddigdd  Zd!S )"TestFindPeaks>
   r   left_ips	right_ipsr  r  r  peak_heightswidth_heightsleft_thresholdsright_thresholdsc                 C   sP   d}t td||||d\}}|jdksJ | jD ]}|| jdks%J qdS )z@
        Test behavior for signal without local maxima.
        r  rS   r   	thresholdr   widthr   N)r   r   rq   r   property_keys)rL   open_intervalr   propskeyr#   r#   r$   test_constantl  s   


zTestFindPeaks.test_constantc                 C   s.  t g d}t |jd d }||ddd< t j|jtd}|ddd |ddd< t ||}t|dd\}}t|g dd	d
 t|d |d	d
 t|d ||d d  d	d
 t|d ||d  d	d
 tt|ddd g dd	d
 tt|ddd g dd	d
 tt|ddd ddgd	d
 dS )z8
        Test plateau size condition for peaks.
        )r&   r   rU   rX   rZ   rc   o   r   r&   Nr   r  )plateau_size)r&   rU   r]   r^   r\   !   rO   FrF   plateau_sizesre   rf   rX   r   )r^   r\   r%  rO   )Nr   )r&   rU   r]   )r`   rT   r\   r%  )	r   rH   r   r   rq   r*   r   r   r   )rL   r&  rM   repeatsr   r   r#   r#   r$   test_plateau_sizex  s0   
zTestFindPeaks.test_plateau_sizec                 C   s   d}t |dd\}}t|tg ddd t|d tg ddd tt |d	dd
 tddgdd tt |ddd
 tddgdd tt |ddd
 tdgdd dS )z2
        Test height condition for peaks.
        )r   UUUUUU?r   r   r   r   r   r  )r   r   FrF   r  )r)  r   r   r   r   rU   r`   )NrU   r&   )r   rU   N)r   r   r   rH   rL   rM   r   r   r#   r#   r$   test_height_condition  s   
z#TestFindPeaks.test_height_conditionc                 C   s  d}t |dd\}}t|tddgdd t|d td	d
g t|d tddg tt |ddd tdgdd tt |ddd tjg tddd tt |ddd tddgdd tt |ddd tdgdd tt |ddd tjg tddd dS )z5
        Test threshold condition for peaks.
        )r   r   r&   rX   r3   r  )r  r&   rU   FrF   r  rp   ri   r  rh   rj   r   r   r   r   )Nr`   )NrX   )r   rX   N)r   r   r   rH   r*   r*  r#   r#   r$   test_threshold_condition  s(   
z&TestFindPeaks.test_threshold_conditionc                 C   s   t ddd}t d}||  t dd|j7  < tt|ddd |dd t|d	dd }t j||d
djdks<J t |}t|dt 	|  g d}t|ddd }|jdkrb|d dksdJ dS )z4
        Test distance condition for peaks.
        r&      rU   r   distancer   FrF   g9m4 @T)assume_uniquerk   )r&   r3   r   rS   N)
r   r   r   r)   r   r   r   	setdiff1dr   	ones_like)rL   	peaks_allrM   peaks_subsetdfsr#   r#   r$   test_distance_condition  s   

z%TestFindPeaks.test_distance_conditionc           	      C   s   t ddd}t ddd}t dd|j}||  |7  < || ||d   }d}t |d |k||d k@ }t||d\}}t||| d	d
 t|d || d	d
 t|d t |d  t|d || d d	d
 dS )z6
        Test prominence condition for peaks.
        r   rS   rO   r&   c   r   )rU   ra   )r   FrF   r  r  r  N)r   r)   r   r   nonzeror   r   
zeros_like)	rL   rM   
peaks_trueoffsetr  intervalkeep
peaks_calc
propertiesr#   r#   r$   test_prominence_condition  s$   
z'TestFindPeaks.test_prominence_conditionc                 C   s   t g d}t|ddd\}}|jdksJ t|dt |  t|d t dg t|d	 t d
g t|d t dg t|d t dg dS )z1
        Test width condition for peaks.
        )	r&   r   r&   r   r&   r   r3   rX   r   r  r   )r  r   r&   r]   r   g?r  rh   r  g@r  g      @N)r   rH   r   r   r   r4  r   r   r*  r#   r#   r$   test_width_condition  s   z"TestFindPeaks.test_width_conditionc                 C   s\   d}g d}t |||||d\}}t|t| jksJ | jD ]}|j|| jks+J qdS )z+
        Test returned properties.
        r  )
r   r&   r   r   r   r   rU   r   r`   ra   r  N)r   r(   r  r   )rL   r  rM   r   r   r!  r#   r#   r$   test_properties  s   

zTestFindPeaks.test_propertiesc                 C   s   t tdd ttd W d   n1 sw   Y  t tdd ttd W d   n1 s5w   Y  t tdd ttddd	 W d   dS 1 sUw   Y  dS )
z5
        Test exceptions raised by function.
        r   rm   r&   Nr  r/  rS   r3   r.  )r   r7   r   r   rH   rq   r   rs   r#   r#   r$   test_raises  s   "zTestFindPeaks.test_raisesz(ignore:some peaks have a prominence of 0r   c                 C   s   t g ddddd\}}t|dt|  t|d t|d  t|d t|d  t|d t|d  dD ]}t|| |d	d
 q<dS )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   r  r   )r   r  r   r  r   r  )r  r  r  r  FrF   N)r   r   r   r4  r;  )rL   r   r   r!  r#   r#   r$   test_wlen_smaller_plateau  s   
	
z'TestFindPeaks.test_wlen_smaller_plateaukwargsr/  ri   r   r  r  r  c                 C   sL   t ddd}| }d|j_t|\}}t|fi |\}}t|| dS )z4
        Test readonly arrays are accepted.
        r   rS      FN)r   r)   r4   flags	writeabler   r   )rL   rG  rM   
x_readonlyr   _peaks_readonlyr#   r#   r$   test_readonly_array  s   z!TestFindPeaks.test_readonly_arrayN)ru   rv   rw   r  r"  r(  r+  r,  r8  rB  rC  rD  rE  rx   ry   r  rF  rz   rN  r#   r#   r#   r$   r  e  s,    
r  c                   @   r{   )TestFindPeaksCwtc                 C   sP   g d}d}t ||\}}tdt|}t||dddd}t||dd	d
 dS )zX
        Generate a series of gaussians and attempt to find the peak locations.
        rj   ri   r   g      4@r   g      I@r   r   r   r   N)
gap_threshmin_snr
min_lengthFz4Found maximum locations did not equal those expected)rG   err_msg)r-   r   r   r.   r   r   )rL   r   
num_pointsr   r   r   
found_locsr#   r#   r$   test_find_peaks_exact6  s   

z&TestFindPeaksCwt.test_find_peaks_exactc                 C   s   g d}d}t ||\}}tdt|}d}tjd |tj|d d|  7 }t||dd	|d
 d}d}t|t|ksDJ |t	|| }	t
|d
 }
tj|	|
dd|
   dS )zz
        Verify that peak locations are (approximately) found
        for a series of gaussians with added noise.
        rP  r   r   gQ?or   r   rH  r&   r`   )rS  rQ  rR  z-Different number of peaks found than expectedzMaximum location differedzby more than N)r-   r   r   r.   randomseedrandr   r(   r   rH   r   r   )rL   r   rU  r   r   r   	noise_amprV  rT  diffs	max_diffsr#   r#   r$   test_find_peaks_withnoiseE  s"   
z*TestFindPeaksCwt.test_find_peaks_withnoisec                 C   sZ   d}d}t jd}||d d|  }t dd}t||dd	d
}t|dks+J dS )zQ
        Verify that no peak is found in
        data that's just noise.
        rh   rO   iW
r   r   rS   rT   r`   r   )rR  
noise_percr   N)r   rY  RandomStater[  r   r   r(   )rL   r\  rU  rngr   r   rV  r#   r#   r$   test_find_peaks_nopeak[  s   z'TestFindPeaksCwt.test_find_peaks_nopeakc                 C   s@   t dd}tg d}t||t d}t|tdgdd d S )N   r   )r&   r   rU   rX   )waveletrO   FrF   )r   r   rH   r   r   r   )rL   rM   r   ar#   r#   r$   )test_find_peaks_with_non_default_waveletsh  s   
z:TestFindPeaksCwt.test_find_peaks_with_non_default_waveletsc           	      C   s   ddg}d}t ||\}}tdt|d}d}tjd}|||d d|  7 }|d	d
  d8  < t||ddddd}t	t
 |j|jksMJ W d   n1 sWw   Y  t||ddddd}|j|jksnJ dS )zq
        Verify that window_size is passed correctly to private function and
        affects the result.
        rp   r   r   g?皙?rX  r   r      i@  r&   rU   N)rQ  rR  rS  window_sizerc   )r-   r   r   r.   rY  ra  r[  r   rx   r   AssertionErrorr   )	rL   r   rU  r   r   r   r\  rb  rV  r#   r#   r$   test_find_peaks_window_sizeo  s$   

z,TestFindPeaksCwt.test_find_peaks_window_sizec                 C   s:   t dt jd}t |}d}t||}t j|d dS )z]
        Verify that the `width` argument
        in `find_peaks_cwt` can be a float
        r   rh  r&       N)r   r   pisinr   r   assert_equal)rL   xsr   r   rV  r#   r#   r$   test_find_peaks_with_one_width  s
   

z/TestFindPeaksCwt.test_find_peaks_with_one_widthN)	ru   rv   rw   rW  r_  rc  rg  rl  rr  r#   r#   r#   r$   rO  4  s    rO  )"r4   numpyr   rx   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%   r-   rD   rE   r|   r   r   r   r  r  rO  r#   r#   r#   r$   <module>   s*    (
	+;bS{  P