
    e!h0                         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 Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!y)    N)assert_equalassert_array_equal)assert_almost_equalassert_array_almost_equalxp_assert_close)
convolve1d)savgol_coeffssavgol_filter)_polyderc                 4    t        | |      }t        ||       y )N)r   r   )pmexpecteddps       n/var/www/html/diagnosisapp-backend/venv/lib/python3.12/site-packages/scipy/signal/tests/test_savitzky_golay.pycheck_polyderr      s    	!QBr8$    c                  x   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 ]M  \  }}}t        t        j                  |      j                  |t        j                  |      j                         O y )
N   r      )      r      r   r   )r   r      
   )r   nparrayT)casesr   r   r   s       r   test_polyderr       s    
a!
a!	Ay!	A1v	As	As
Y	Y	$:;
Y	aVb!W$56
Y	aS2$K0
Y	aS1#J/E   >1hbhhqkmmQ(:(<(<=>r   c                     || dz  }t        j                  |       }||k(  j                  t              }t        j                  t        j
                  |||      |      }|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.

    r   )r   arangeastypeintpolyvalpolyfit)window_length	polyorderpostuniths         r   alt_sg_coeffsr-   +   sW     {q 
		- AHS!D


2::ay115AHr   c                      t        dd      } t        | dg       t        dd      } t        | g dd       t        d	d
      } t        | g dd       t        d	d
d      } t        | g dd       t        d	d
dd      } t        | g dd       y )Nr   r         ?r   r   )        r   r   绽|=atolr      )r0   r   r   r   r   r)   )r0   r   r   r   r   dotr)   use)r0   r   r   r   r   )r	   r   )r,   s    r   test_sg_coeffs_trivialr9   =   s    aAAuaAA{/aAA(u5a"AA(u5au-AA(u5r   c           
          d gt        t        |             z   D ]4  }t        | ||d      }t        | ||      }t	        ||dd| ||fz         6 y )Nr6   r7   r5   r1   z(window_length = %d, order = %d, pos = %s)r3   err_msg)listranger	   r-   r   )r'   orderr)   h1h2s        r   compare_coeffs_to_altrA   O   sb     vU=122 ?=%SeD=%S9BU!K"/!<"=	??r   c                  `    t        ddd      D ]  } t        |       D ]  }t        | |          y )Nr      r   )r=   rA   )r'   r>   s     r   test_sg_coeffs_comparerD   [   s7    q!Q 8=) 	8E!-7	88r   c                     d} d}|dz  }t        j                  ddd      }|d   |d   z
  }d|d	z  z  |z
  }t        ||       }t        ||      }t	        |||  |||         d
|dz  z  dz
  }t        || d|      }t        ||      }	t	        |	||  |||         d|z  }
t        || d|      }t        ||      }t	        |||  |
||         y )Nr4   	   r   r      +   r         ?r   g      ?)derivdelta      @)r   linspacer	   r   r   )r(   r'   halflenxrK   yr,   y0dyy1d2yy2s               r   test_sg_coeffs_exactrV   b   s   IMq G
Ar2AaD1Q4KE
 	a1fqAmY/A	Aq	BBwx(!GWH*=> 
qAv	BmYauEA	Aq	BBwx("WgX*>? 'CmYauEA	Aq	BBwx(#gwh*?@r   c            	         t        j                  g d      } | dz  dz  }| dz  }t        j                  | d      }t        |j                        D ]  }t        dd|dd	      }t        |j                  |      ||   d
       t        dd|ddd      }t        |j                  |      ||   d
       t        dd|ddd      }t        |j                  |      ||   d
        y )N)g       r0          @      @g      @r   r4   rI   r   r   rX   r6   )r)   rK   r8   r1   r2   r   )r)   rK   r8   rJ   )r   r   	full_liker=   sizer	   r   r6   )irO   dxd2xr)   coeffs0coeffs1coeffs2s           r   test_sg_coeffs_derivrb      s     	+,A	Q
A	
QB
,,q#
CQVV} >1#SeDA#U;1#Se1MA3e<1#Se1MACu=>r   c                      t        ddd      } t        | t        j                  d             t        ddd      } t        | t        j                  d             y)	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(   rJ   r   r4   r   N)r	   r   r   zeros)coeffss    r   !test_sg_coeffs_deriv_gt_polyorderrf      sD     13Fvrxx{+13Fvrxx{+r   c                      t        dd      } t        | | d d d          t        ddd      }t        ||d d d           y )N   rF   r   )rJ   )r	   r   )r_   r`   s     r   test_sg_coeffs_largerj      sD     B"Ggwtt}5B+Gg"~6r   c                  0   g d} | D ]1  }t        |dd      }t        |t        j                  |      |z         3 d }d }| D ]  }|dz  }t	        | dz   |dz         D cg c]  } |||       c}d d d   }t        |dd      }t        ||       t        |dd      }t        ||       t	        | dz   |dz         D cg c]  } |||       c}d d d   }t        |dd      }t        ||       t        |dd      }t        ||        y c c}w c c}w )	N)r4   r   rC   r            r   c                 <    d| dz
  z  d|z  dz   |z  d|z  dz
  z  z  S )Nr   rI   r   r    )kr   s     r   h_p_d_closed_form_1z>test_sg_coeffs_even_window_length.<locals>.h_p_d_closed_form_1   s.    !c'{QqS1WaK1q122r   c                     dd|dz  z  dz   d| dz
  dz  z  z   z  }dd|z  dz   z  |dz   z  |z  |dz
  z  d|z  dz
  z  }||z  S )N   r   r   rl   rI   r4   rp   )rq   r   numerdenoms       r   h_p_d_closed_form_2z>test_sg_coeffs_even_window_length.<locals>.h_p_d_closed_form_2   sh    Bq!tGaK"a#g\/121Q37QU#A%q1u-qsQw7U{r   r   r   ri   r   )r	   r   r   	ones_liker=   )	window_lengthslengthh_p_drr   rx   r   rq   expected_outputactual_outputs	            r   !test_sg_coeffs_even_window_lengthr      sF   .N  =fa+r||E2V;<=3
 ! 8AI$)1"q&!a%$8:  /q!4 ::>B$@%fa37%fa37 %*1"q&!a%$8:  /q!4 ::>B$@%fa37%fa378::s    D Dc                     t        j                  dg      } t        | dd      }t        |dg       t        j                  dg      } t        | ddd      }t	        |dgd	       t        j                  dg      } t        | ddd
      }t	        |dgd	       t        j                  dgdz        } t        | ddd      }t	        |g dd	       y)z2 Test some trivial edge cases for savgol_filter().r/   r   r   rL   r   constantmodert   )decimalnearestwrap)r/   r/   r/   N)r   r   r
   r   r   rO   rP   s     r   test_sg_filter_trivialr      s    
#AaAASE
 	#AaAJ/AC5"-
#AaAI.AC5"-
#AaAF+A?B7r   c                      t        j                  g d      } t        | ddd      }t        |g d       t        | ddd      }t        |g d       t        | ddd	      }t        |g d
       y )Nr/   rX   r/   r   r   r   r   r/   UUUUUU?r/   mirror)竪?r   r   r   )r   r   r   )r   r   r
   r   r   s     r   test_sg_filter_basicr      sa    
!AaAJ/AA*+aAH-AA23aAF+AA23r   c                     t        j                  g dg dg      } t        j                  g dg dg      }t        | ddd      }t        ||       t        | j                  dddd	
      }t        ||j                         y )Nr   )rX   rY   rX   r   )rX   gUUUUUU@rX   r   r   r   r   r   )r   axis)r   r   r
   r   r   )rO   r   rP   s      r   test_sg_filter_2dr      sq    
/!# 	$Axx,,. /HaAJ/AAx acc1ajq9AAxzz"r   c            	      F   t        j                  ddd      } | d   | d   z
  }t        j                  | d| dz  z  | dz  | z
  g      }t        j                  t        j                  |       d| z  d| dz  z  d	z
  g      }t        j                  t        j                  |       t        j
                  | d      d| z  g      }d
}t        ||ddd      }t        ||d       t        ||dddd|      }t        ||d       t        ||dddd|      }t        ||d       |j                  }|j                  }|j                  }t        ||ddd      }t        ||d       t        ||dddd|      }t        ||d       t        ||dddd|      }t        ||d       y )Nr   rG   r   r   r   r   r   r/   r   ri   interp)r   r   g-q=r2   r   r   rJ   rK   )	r   rM   r   ry   
zeros_likerZ   r
   r   r   )	r*   rK   rO   r]   r^   r'   rP   rS   rU   s	            r   test_sg_filter_interp_edgesr      s   
 	B2AaD1Q4KE
!a1f*q&1* 	A 
2<<?q5qAv:#% 
&B ((BMM!$LLA&E C MaBAAqu%	q-(e
-BB'	q-(e
-BB%( 	
A	B
%%CaAAAqu%	q-e
-BB'	q-e
-BB%(r   c            	      V   t        j                  ddd      } | d   | d   z
  }t        j                  | |  g      }t        j                  | dz  d| dz  z  dz   g      }t        j                  | dz  d| dz  z  | dz  z   d| z  z
  g      }t        j                  t        j                  |       t        j                  |        g      }t        j                  d| z  d	| z  g      }t        j                  d| dz  z  d	| dz  z  d| z  z   dz
  g      }t        j                  |||g      }t        j                  |||g      }	t	        |d
ddd|      }
t        |
|d       t	        |d
dddd|      }t        ||	d       t        j                  |j                  |j                  |j                  g      }t        j                  |j                  |j                  |j                  g      }	t	        |d
ddd|      }
t        |
|d       t	        |d
dddd|      }t        ||	d       |j                  dd      j                         }|	j                  dd      j                         }	t	        |d
ddd|      }
t        |
|d       t	        |d
dddd|      }t        ||	d       y )Nr   r   rG   r   r   r   r   rI   r   r   ri   r   )r   r   rK   r1   r2   r   )	r   rM   r   ry   r
   r   r   swapaxescopy)r*   rK   x1x2x3dx1dx2dx3zdzrP   rR   s               r   test_sg_filter_interp_edges_3dr   1  sf   
B2AaD1Q4KE	1qb'	B	161qAv:>*	+B	161qAv:Q.q89	:B
((BLLObll1o%56
7C
((AE1q5>
"C
((AQJAF
QU 2S 89
:C 	"b"A	3S/	"BaABXUCAAqu%	q!QRhau	MBB' 	"$$bdd#$A	355#%%'	(BaAAHEBAAqu%	q!QQXQe	LBB' 	


1aA	Q				!BaAAHEBAAqu%	q!QQXQe	LBB'r   c                  j   t        j                  d      } t        | ddd       t        j                  t
        d      5  t        | ddd       d	d	d	       t        | d
ddd       t        j                  t
        d      5  t        | dddd       d	d	d	       y	# 1 sw Y   NxY w# 1 sw Y   y	xY w)z=Tests that the window_length check is using the correct axis.)r            r   r   )r'   r(   r   zwindow_length must be less than)matchrh   NrF   r   )r'   r(   r   r      )r   onesr
   pytestraises
ValueError)rO   s    r   %test_sg_filter_valid_window_length_3dr   [  s     	A!2B	z)J	K GarQXFG !1I	z)J	K OarQQXNO OG GO Os    BB)B&)B2)"r   numpyr   numpy.testingr   r   scipy._lib._array_apir   r   r   scipy.ndimager   scipy.signalr	   r
   scipy.signal._savitzky_golayr   r   r    r-   r9   rA   rD   rV   rb   rf   rj   r   r   r   r   r   r   r   rp   r   r   <module>r      s       % 5 1%
>*$6$	?8A:> 
,7 8N8,
4	#.)b'(TOr   