o
    h0                     @   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   Z/var/www/vscode/kcb/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 )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   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 )Nr   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*