o
    g0                     @   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expecteddp r   d/home/ubuntu/cloudmapper/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 )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   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_trivial9   s   


r2   c              	   C   sT   d gt t|  D ]}t| ||dd}t| ||d}t||dd| ||f d q	d S )Nr/   r0   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   r9   c                  C   s.   t dddD ]} t | D ]}t| | qqd S )Nr      r   )r5   r9   )r#   r6   r   r   r   test_sg_coeffs_compareW   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xrA   yr(   y0dyy1d2yy2r   r   r   test_sg_coeffs_exact^   s"   



"rL   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       g               @      @g      @r   r-   r?   r   r   rM   r/   )r%   rA   r1   r*   r+   r   )r%   rA   r1   r@   )r   r   	full_liker5   sizer   r   r/   )irE   dxd2xr%   coeffs0coeffs1coeffs2r   r   r   test_sg_coeffs_deriv{   s   rW   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)coeffsr   r   r   !test_sg_coeffs_deriv_gt_polyorder   s   rZ   c                  C   sF   t dd} t| | d d d  t dddd}t||d d d   d S )N   r<   r   )r@   )r   r   )rT   rU   r   r   r   test_sg_coeffs_large   s   
r]   c                     s  g d} | 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|| q d S )N)r-   r   r:   r            r   r   c                 S   s(   d| d  d| d | d| d   S )Nr   r?   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^   r?   r-   r   )ra   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   .0ra   )rb   r   r   r   
<listcomp>       z5test_sg_coeffs_even_window_length.<locals>.<listcomp>r\   c                    rh   r   r   ri   )rg   r   r   r   rk      rl   r   )r   r   r5   )window_lengthslengthh_p_dexpected_outputactual_outputr   )rb   rg   r   r   !test_sg_coeffs_even_window_length   s6   


rr   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   rB   r   constantmoderc   )decimalnearestwrap)rs   rs   rs   N)r   r   r	   r   r   rE   rF   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rs   rM   rs   r   r   rt   ru   rs   UUUUUU?rs   mirror)竪?r~   r   ry   )r~   r~   r~   )r   r   r	   r   rz   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|   )rM   rN   rM   r}   )rM   gUUUUUU@rM   r   r   rt   ru   r   )rv   axis)r   r   r	   r   r   )rE   r   rF   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   rs   r   r\   interp)r   rv   g-q=r+   r   rv   r@   rA   )	r   rC   r   	ones_like
zeros_likerO   r	   r   r   )	r&   rA   rE   rR   rS   r#   rF   rI   rK   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   r?   r   r   r\   r   )r   rv   rA   r*   r+   r   )	r   rC   r   r   r	   r   r   swapaxescopy)r&   rA   x1x2x3dx1dx2dx3zdzrF   rH   r   r   r   test_sg_filter_interp_edges_3d-  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$   rv   zwindow_length must be less than)matchr[   Nr<   r   )r#   r$   r   rv      )r   onesr	   pytestraises
ValueError)rE   r   r   r   %test_sg_filter_valid_window_length_3dW  s   
"r   )!r   numpyr   numpy.testingr   r   r   r   r   scipy.ndimager   scipy.signalr   r	   scipy.signal._savitzky_golayr
   r   r   r)   r2   r9   r;   rL   rW   rZ   r]   rr   r{   r   r   r   r   r   r   r   r   r   <module>   s.    '1*