U
    Hvf0                     @   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   J/tmp/pip-unpacked-wheel-96ln3f52/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 qd 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 )zThis 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   h1h2r   r   r   compare_coeffs_to_altK   s    r3   c                  C   s.   t dddD ]} t | D ]}t| | qqd S )Nr      r   )r/   r3   )r   r0   r   r   r   test_sg_coeffs_compareW   s    r5   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xr;   yr"   Zy0dyy1Zd2yy2r   r   r   test_sg_coeffs_exact^   s"    



rC   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'   r9   r   r   r)   )r   r;   r+   r$   r%   r   )r   r;   r+   r:   )r   r   	full_liker/   sizer   r   r)   )ir>   dxd2xr   coeffs0coeffs1Zcoeffs2r   r   r   test_sg_coeffs_deriv{   s    rM   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   r:   r   r'   r   N)r   r   r   zeros)Zcoeffsr   r   r   !test_sg_coeffs_deriv_gt_polyorder   s    rO   c                  C   sF   t dd} t| | d d d  t dddd}t||d d d   d S )N   r6   r   )r:   )r   r   )rK   rL   r   r   r   test_sg_coeffs_large   s    
rR   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   r4   r            r   r   c                 S   s(   d| d  d| d | d| d   S )Nr   r9   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   rS   r9   r'   r   )rV   r   ZnumerZ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   .0rV   )rW   r   r   r   
<listcomp>   s   z5test_sg_coeffs_even_window_length.<locals>.<listcomp>rQ   c                    s   g | ]} |qS r   r   r[   )rZ   r   r   r   r]      s   r   )r   r   r/   )Zwindow_lengthslengthZh_p_dZexpected_outputZactual_outputr   )rW   rZ   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moderX   )decimalZnearestwrapN)r   r   r	   r   r   r>   r?   r   r   r   test_sg_filter_trivial   s    rg   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`   rD   r   r   ra   rb   UUUUUU?Zmirrorg?re   )r   r   r	   r   rf   r   r   r   test_sg_filter_basic   s    ri   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`   rD   rE   rh   gUUUUUU@r   r   ra   rb   r   )rc   axis)r   r   r	   r   r   )r>   r   r?   r   r   r   test_sg_filter_2d   s    
rk   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 )Nr   r7   r   r   r   r   r   r`   r   rQ   interp)rj   rc   g-q=r%   rj   rc   r:   r;   )	r   r=   r   	ones_likeZ
zeros_likerF   r	   r   r   )	r    r;   r>   rI   rJ   r   r?   rA   rB   r   r   r   test_sg_filter_interp_edges   sT    


    rp   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 )Nrl   r   r7   r   r   r   r   r9   r   r   rQ   rm   )rj   rc   r;   r$   r%   rn   )	r   r=   r   ro   r	   r   r   Zswapaxescopy)r    r;   x1Zx2Zx3Zdx1Zdx2Zdx3zZdzr?   r@   r   r   r   test_sg_filter_interp_edges_3d-  s4    **rt   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   rm   )r   r   rc   zwindow_length must be less than)matchrP   r6   r   )r   r   rj   rc      N)r   Zonesr	   pytestZraises
ValueError)r>   r   r   r   %test_sg_filter_valid_window_length_3dW  s    
r|   )!rz   Znumpyr   Znumpy.testingr   r   r   r   r   Zscipy.ndimager   Zscipy.signalr   r	   Zscipy.signal._savitzky_golayr
   r   r   r#   r,   r3   r5   rC   rM   rO   rR   r_   rg   ri   rk   rp   rt   r|   r   r   r   r   <module>   s,   '1*