U
    »mœdˆ0  ã                   @   sà   d dl Z d dlZd dlmZmZ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_allcloseÚassert_equalÚassert_almost_equalÚassert_array_equalÚassert_array_almost_equal)Ú
convolve1d)Úsavgol_coeffsÚsavgol_filter)Ú_polyderc                 C   s   t | |ƒ}t||ƒ d S )N)r
   r   )ÚpÚmÚexpectedZdp© r   ú_/home/sam/Atlas/atlas_env/lib/python3.8/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dddgddddgfdddgdddgfdddgddgfdddgddgfdddgdddggddddgdddggfdddgdddggdddgddggfdddgdddggddgdggfdddgdddggddgdggfg
} | D ]&\}}}t t |¡j|t |¡jƒ qòd S )	Né   r   é   é   é   é   é   é
   )r   ÚnpÚarrayÚT)Zcasesr   r   r   r   r   r   Útest_polyder   s    ($  ör   c                 C   sB   |dk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   ZarangeZastypeÚintZpolyvalZ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| dddgdd� t ddƒ} t| dddddgdd� t dddd	�} t| dddddgdd� t dddd
d�} t| dddddgdd� d S )Nr   r   r   r   ç»½×Ùß|Û=©Úatolr   é   ©r   Údot©r   Úuse)r   r   )r"   r   r   r   Útest_sg_coeffs_trivial9   s    


r,   c              	   C   sT   d gt t| ƒƒ D ]<}t| ||dd�}t| ||d�}t||dd| ||f d� qd S )Nr)   r*   r(   r$   z(window_length = %d, order = %d, pos = %s)r&   Úerr_msg)ÚlistÚranger   r#   r   )r   Úorderr   Zh1Zh2r   r   r   Úcompare_coeffs_to_altK   s    ÿÿr1   c                  C   s.   t dddƒD ]} t | ƒD ]}t| |ƒ qqd S )Nr   é   r   )r/   r1   )r   r0   r   r   r   Útest_sg_coeffs_compareW   s    r3   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   ZhalflenÚxr9   Úyr"   Zy0ÚdyÚy1Zd2yÚy2r   r   r   Útest_sg_coeffs_exact^   s"    



rA   c               	   C   sÊ   t  dddddg¡} | d d }| d }t  | d¡}t|jƒD ]†}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 )Ng       Àg        ç       @ç      @g      @r   r'   r7   r   r   r)   )r   r9   r+   r$   r%   r   )r   r9   r+   r8   )r   r   Ú	full_liker/   Úsizer   r   r)   )Úir<   ÚdxÚd2xr   Úcoeffs0Úcoeffs1Zcoeffs2r   r   r   Útest_sg_coeffs_deriv{   s    rK   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   r8   r   r'   r   N)r   r   r   Zzeros)Zcoeffsr   r   r   Ú!test_sg_coeffs_deriv_gt_polyorder‹   s    rL   c                  C   sF   t ddƒ} t| | d d d… ƒ t dddd�}t||d d d…  ƒ d S )Né   r4   éÿÿÿÿr   )r8   )r   r   )rI   rJ   r   r   r   Útest_sg_coeffs_large˜   s    
rO   c                     s  dddddddg} | D ]}t |ddƒ}t|d	| ƒ 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||ƒ qJd S )Nr'   r   r2   r   é   é   é   r   r   c                 S   s(   d| d  d| d | d| d   S )Nr   r7   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   rP   r7   r'   r   )rS   r   Z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                    s   g | ]}ˆ |ˆƒ‘qS r   r   ©Ú.0rS   )rT   r   r   r   Ú
<listcomp>º   s   ÿz5test_sg_coeffs_even_window_length.<locals>.<listcomp>rN   c                    s   g | ]}ˆ |ˆƒ‘qS r   r   rY   )rX   r   r   r   r[   Á   s   ÿr   )r   r   r/   )Zwindow_lengthsÚlengthZh_p_dZexpected_outputZactual_outputr   )rT   rX   r   r   Ú!test_sg_coeffs_even_window_length¦   s4    ÿÿ

ÿÿ
r]   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|dddgdd	� dS )z2 Test some trivial edge cases for savgol_filter().ç      ð?r   r   r:   r   Úconstant©ÚmoderU   )ÚdecimalZnearestÚwrapN)r   r   r	   r   r   ©r<   r=   r   r   r   Útest_sg_filter_trivialÍ   s    re   c                  C   st   t  dddg¡} t| dddd�}t|dddgƒ t| dddd�}t|d	dd	gƒ t| ddd
d�}t|dddgƒ d S )Nr^   rB   r   r   r_   r`   çUUUUUUõ?Zmirrorg«ªªªªªú?rc   )r   r   r	   r   rd   r   r   r   Útest_sg_filter_basicã   s    rg   c                  C   sr   t  dddgdddgg¡} t  dddgdddgg¡}t| dddd	�}t||ƒ t| jdddd
d�}t||jƒ d S )Nr^   rB   rC   rf   gUUUUUU@r   r   r_   r`   r   )ra   Úaxis)r   r   r	   r   r   )r<   r   r=   r   r   r   Útest_sg_filter_2dð   s    ÿÿ
ri   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   r5   r   r   r   r   r   r^   r   rN   Úinterp)rh   ra   gê-�™—q=r%   ©rh   ra   r8   r9   )	r   r;   r   Ú	ones_likeZ
zeros_likerD   r	   r   r   )	r    r9   r<   rG   rH   r   r=   r?   r@   r   r   r   Útest_sg_filter_interp_edgesü   sT    

þþ
þ ÿ ÿ ÿ ÿrn   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 )Nrj   r   r5   r   r   r   r   r7   r   r   rN   rk   )rh   ra   r9   r$   r%   rl   )	r   r;   r   rm   r	   r   r   ZswapaxesÚcopy)r    r9   Úx1Zx2Zx3Zdx1Zdx2Zdx3ÚzZdzr=   r>   r   r   r   Útest_sg_filter_interp_edges_3d-  s4    **rr   c               	   C   s†   t  d¡} t| dddd� tjtdd�� t| dddd� W 5 Q R X t| d	dd
dd� tjtdd�� t| ddd
dd� W 5 Q R X dS )z=Tests that the window_length check is using the correct axis.)r   é   é   é   r   rk   )r   r   ra   zwindow_length must be less than)ÚmatchrM   r4   r   )r   r   rh   ra   é   N)r   Zonesr	   ÚpytestZraisesÚ
ValueError)r<   r   r   r   Ú%test_sg_filter_valid_window_length_3dW  s    
rz   )!rx   Únumpyr   Znumpy.testingr   r   r   r   r   Zscipy.ndimager   Zscipy.signalr   r	   Zscipy.signal._savitzky_golayr
   r   r   r#   r,   r1   r3   rA   rK   rL   rO   r]   re   rg   ri   rn   rr   rz   r   r   r   r   Ú<module>   s,   '1*