o
    Ö­j×0  ã                   @   sè   d dl Z d dlZd dlmZmZ d dlmZmZm	Z	 d dl
mZ d dlmZmZ d dlm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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S ))é    N)Úassert_equalÚassert_array_equal)Úassert_almost_equalÚassert_array_almost_equalÚxp_assert_close)Ú
convolve1d)Úsavgol_coeffsÚsavgol_filter)Ú_polyderc                 C   s   t | |ƒ}t||ƒ d S )N)r
   r   )ÚpÚmÚexpectedÚdp© r   úc/var/www/html/CropPilot/venv/lib/python3.10/site-packages/scipy/signal/tests/test_savitzky_golay.pyÚcheck_polyder   s   
r   c                  C   s   dgddgfdgddgfg d¢dg d¢fg d¢dddgfg d¢ddgfg d¢ddgfg d¢g d¢gdg d¢g d¢gfg d¢g d¢gdddgd	dggfg d¢g d¢gddgd	ggfg d¢g d¢gddgdggfg
} | D ]\}}}t t |¡j|t |¡jƒ qjd S )
Né   r   é   )é   é   r   é   r   r   )r   r   é   é
   )r   ÚnpÚarrayÚT)Úcasesr   r   r   r   r   r   Útest_polyder   s     öÿr   c                 C   sB   |du r| d }t  | ¡}||k t¡}t  t  |||¡|¡}|S )züThis is an alternative implementation of the SG coefficients.

    It uses numpy.polyfit and numpy.polyval. The results should be
    equivalent to those of savgol_coeffs(), but this implementation
    is slower.

    window_length should be odd.

    Nr   )r   ÚarangeÚastypeÚintÚpolyvalÚpolyfit)Úwindow_lengthÚ	polyorderÚposÚtÚunitÚhr   r   r   Úalt_sg_coeffs+   s   

r)   c                  C   s”   t ddƒ} t| dgƒ t ddƒ} t| g d¢dd� t d	d
ƒ} t| g d¢dd� t d	d
dd�} t| g d¢dd� t d	d
ddd�} t| g d¢dd� d S )Nr   r   ç      ð?r   r   )ç        r   r   ç»½×Ùß|Û=©Úatolr   é   )r+   r   r   r   r   ©r%   )r+   r   r   r   r   Údot©r%   Úuse)r+   r   r   r   r   )r   r   )r(   r   r   r   Útest_sg_coeffs_trivial=   s   


r4   c              	   C   sT   d gt t| ƒƒ D ]}t| ||dd�}t| ||d�}t||dd| ||f d� q	d S )Nr1   r2   r0   r,   z(window_length = %d, order = %d, pos = %s)r.   Úerr_msg)ÚlistÚranger   r)   r   )r#   Úorderr%   Úh1Úh2r   r   r   Úcompare_coeffs_to_altO   s   ÿÿýr;   c                  C   s.   t dddƒD ]} t | ƒD ]}t| |ƒ qqd S )Nr   é   r   )r7   r;   )r#   r8   r   r   r   Útest_sg_coeffs_compare[   s
   ÿÿr=   c                  C   sü   d} d}|d }t  ddd¡}|d |d  }d|d	  | }t|| ƒ}t||ƒ}t||| … ||| … ƒ d
|d  d }t|| d|d�}t||ƒ}	t|	|| … ||| … ƒ d| }
t|| d|d�}t||ƒ}t||| … |
|| … ƒ d S )Nr/   é	   r   r   é   é+   r   ç      à?r   g      ø?)ÚderivÚdeltaç      @)r   Úlinspacer   r   r   )r$   r#   ÚhalflenÚxrC   Úyr(   Úy0ÚdyÚy1Úd2yÚy2r   r   r   Útest_sg_coeffs_exactb   s"   



"rN   c               	   C   sÄ   t  g d¢¡} | d d }| d }t  | d¡}t|jƒD ]C}tdd|ddd	�}t| |¡|| d
d� tdd|dddd�}t| |¡|| d
d� tdd|dddd�}t| |¡|| d
d� qd S )N)g       Àr+   ç       @ç      @g      @r   r/   rA   r   r   rO   r1   )r%   rC   r3   r,   r-   r   )r%   rC   r3   rB   )r   r   Ú	full_liker7   Úsizer   r   r1   )ÚirG   ÚdxÚd2xr%   Úcoeffs0Úcoeffs1Úcoeffs2r   r   r   Útest_sg_coeffs_deriv   s   úrY   c                  C   s@   t dddd�} t| t d¡ƒ t dddd�} t| t d¡ƒ dS )	zº
    If deriv > polyorder, the coefficients should be all 0.
    This is a regression test for a bug where, e.g.,
        savgol_coeffs(5, polyorder=1, deriv=2)
    raised an error.
    r   r   r   )r$   rB   r   r/   r   N)r   r   r   Úzeros)Úcoeffsr   r   r   Ú!test_sg_coeffs_deriv_gt_polyorder�   s   r\   c                  C   sF   t ddƒ} t| | d d d… ƒ t dddd�}t||d d d…  ƒ d S )Né   r>   éÿÿÿÿr   )rB   )r   r   )rV   rW   r   r   r   Útest_sg_coeffs_largeœ   s   
r_   c                     s  g d¢} | D ]}t |ddƒ}t|t |¡| ƒ qdd„ ‰ dd„ ‰| D ]`}|d ‰‡ ‡fdd	„tˆ d
 ˆd
 ƒD ƒd d d… }t |d
d
ƒ}t||ƒ t |dd
ƒ}t||ƒ ‡‡fdd	„tˆ d
 ˆd
 ƒD ƒd d d… }t |ddƒ}t||ƒ t |ddƒ}t||ƒ q#d S )N)r/   r   r<   r   é   é   é   r   c                 S   s(   d| d  d| d | d| d   S )Nr   rA   r   r   r   )Úkr   r   r   r   Úh_p_d_closed_form_1³   s   (z>test_sg_coeffs_even_window_length.<locals>.h_p_d_closed_form_1c                 S   s\   dd|d  d d| d d    }dd| d  |d  | |d  d| d  }|| S )Né   éüÿÿÿr   r   r`   rA   r/   r   )rc   r   ÚnumerÚdenomr   r   r   Úh_p_d_closed_form_2·   s   $0z>test_sg_coeffs_even_window_length.<locals>.h_p_d_closed_form_2r   c                    ó   g | ]}ˆ |ˆƒ‘qS r   r   ©Ú.0rc   )rd   r   r   r   Ú
<listcomp>¾   ó    ÿz5test_sg_coeffs_even_window_length.<locals>.<listcomp>r   r^   c                    rj   r   r   rk   )ri   r   r   r   rm   Å   rn   r   )r   r   r   Ú	ones_liker7   )Úwindow_lengthsÚlengthÚh_p_dÚexpected_outputÚactual_outputr   )rd   ri   r   r   Ú!test_sg_coeffs_even_window_lengthª   s6   ÿÿ

ÿÿ
òru   c                  C   s²   t  dg¡} t| ddƒ}t|dgƒ t  dg¡} t| dddd�}t|dgdd	� t  dg¡} t| ddd
d�}t|dgdd	� t  dgd ¡} t| dddd�}t|g d¢dd	� dS )z2 Test some trivial edge cases for savgol_filter().r*   r   r   rD   r   Úconstant©Úmodere   )ÚdecimalÚnearestÚwrap)r*   r*   r*   N)r   r   r	   r   r   ©rG   rH   r   r   r   Útest_sg_filter_trivialÑ   s   r}   c                  C   sl   t  g d¢¡} t| dddd�}t|g d¢ƒ t| dddd�}t|g d¢ƒ t| ddd	d�}t|g d
¢ƒ d S )N©r*   rO   r*   r   r   rv   rw   ©r*   çUUUUUUõ?r*   Úmirror)ç«ªªªªªú?r€   r‚   r{   )r€   r€   r€   )r   r   r	   r   r|   r   r   r   Útest_sg_filter_basicç   s   rƒ   c                  C   sj   t  g d¢g d¢g¡} t  g d¢g d¢g¡}t| dddd�}t||ƒ t| jdddd	d
�}t||jƒ d S )Nr~   )rO   rP   rO   r   )rO   gUUUUUU@rO   r   r   rv   rw   r   )rx   Úaxis)r   r   r	   r   r   )rG   r   rH   r   r   r   Útest_sg_filter_2dô   s   
ÿ
ÿ
r…   c            	   	   C   sp  t  ddd¡} | d | d  }t  | d| d  | d |  g¡}t  t  | ¡d|  d| d  d	 g¡}t  t  | ¡t  | d¡d|  g¡}d
}t||dddd�}t||dd� t||dddd|d�}t||dd� t||dddd|d�}t||dd� |j}|j}|j}t||dddd�}t||dd� t||dddd|d�}t||dd� t||dddd|d�}t||dd� d S )Néûÿÿÿr   r?   r   r   r   r   r   r*   r   r^   Úinterp)r„   rx   gê-�™—q=r-   ©r„   rx   rB   rC   )	r   rE   r   ro   Ú
zeros_likerQ   r	   r   r   )	r&   rC   rG   rT   rU   r#   rH   rK   rM   r   r   r   Útest_sg_filter_interp_edges   sL   

þþ
þÿÿÿÿrŠ   c               	   C   s  t  ddd¡} | d | d  }t  | |  g¡}t  | d d| d  d g¡}t  | d d| d  | d  d|   g¡}t  t  | ¡t  | ¡ g¡}t  d|  d	|  g¡}t  d| d  d	| d  d|   d g¡}t  |||g¡}t  |||g¡}	t|d
ddd|d�}
t|
|dd� t|d
dddd|d�}t||	dd� t  |j|j|jg¡}t  |j|j|jg¡}	t|d
ddd|d�}
t|
|dd� t|d
dddd|d�}t||	dd� | dd¡ ¡ }|	 dd¡ ¡ }	t|d
ddd|d�}
t|
|dd� t|d
dddd|d�}t||	dd� d S )Nr†   r   r?   r   r   r   r   rA   r   r   r^   r‡   )r„   rx   rC   r,   r-   rˆ   )	r   rE   r   ro   r	   r   r   ÚswapaxesÚcopy)r&   rC   Úx1Úx2Úx3Údx1Údx2Údx3ÚzÚdzrH   rJ   r   r   r   Útest_sg_filter_interp_edges_3d1  s4   **r•   c                  C   s°   t  d¡} t| dddd� tjtdd�� t| dddd� W d	  ƒ n1 s'w   Y  t| d
dddd� tjtdd�� t| ddddd� W d	  ƒ d	S 1 sQw   Y  d	S )z=Tests that the window_length check is using the correct axis.)r   é   é   é   r   r‡   )r#   r$   rx   zwindow_length must be less than)Úmatchr]   Nr>   r   )r#   r$   r„   rx   é   )r   Úonesr	   ÚpytestÚraisesÚ
ValueError)rG   r   r   r   Ú%test_sg_filter_valid_window_length_3d[  s   
þ"þrŸ   )"rœ   Únumpyr   Únumpy.testingr   r   Úscipy._lib._array_apir   r   r   Úscipy.ndimager   Úscipy.signalr   r	   Úscipy.signal._savitzky_golayr
   r   r   r)   r4   r;   r=   rN   rY   r\   r_   ru   r}   rƒ   r…   rŠ   r•   rŸ   r   r   r   r   Ú<module>   s0    '1*