
    >qj7                        d dl Z d dlZd dlmZ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 e j"                  j$                  Ze j"                  j&                  Ze j"                  j%                  dd      Zd	 Ze j"                  j-                  d
d      d        Zd Z ee      d        Zd Z ee      d        Z ee      d        Z ee      d        Z ee      d        Z edd       ee      d               Z ee      d        Z  ee      d        Z! ee      d        Z" ee      d        Z# ee      d        Z$ ee      d        Z% ee      d        Z&y)    N)xp_assert_closexp_assert_equalxp_swapaxesis_torchmake_xp_test_case_xp_copy_to_numpy)
convolve1d)savgol_coeffssavgol_filter)_polyderz
dask.arrayzlinalg.lstsq is missing rcond)reasonc                 8    t        | ||      }t        ||       y )Nxp)r   r   )pmexpectedr   dps        e/opt/rentech/trading_bot/.venv/lib/python3.12/site-packages/scipy/signal/tests/test_savitzky_golay.pycheck_polyderr      s    	!Q2	BB!    Fprivatec                    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 ]l  \  }}}| j                  |      }| j                  |      }t        |j                  dk(  r|j                  n|||j                  dk(  r|j                  n||        n y )
N   r      )      r      r   r   )r   r      
   )asarrayr   ndimT)r   casesr   r   r   ppees          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ZZ]ZZ!GGqLBDDbGGaKBDDR		

r   c                     || dz  }t        j                  |       }||k(  j                  t              }t        j                  t        j
                  |||      |      }|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   )nparangeastypeintpolyvalpolyfitr!   )window_length	polyorderposr   tuniths          r   alt_sg_coeffsr5   8   s`     {q 
		- AHS!D


2::ay115A::a=r   c                 >   t        dd|       }t        || j                  dg| j                               t        dd|       }t        || j                  g d| j                        d	
       t        dd|       }t        || j                  g d| j                        d	
       t        ddd|       }t        || j                  g d| j                        d	
       t        dddd|       }t        || j                  g d| j                        d	
       y )Nr   r   r         ?dtyper   r   )        r   r   绽|=atolr      )r:   r   r   r   r   r1   r   )r:   r   r   r   r   dotr1   user   )r:   r   r   r   r   )r
   r   r!   float64)r   r4   s     r   test_sg_coeffs_trivialrD   J   s     	ar"AArzz3%rzzz:;ar"AArzz+RZZz@uMar"AArzz"32::zFUSab)AArzz"32::zFUSau4AArzz"32::zFUSr   c                     d gt        t        |             z   D ]9  }t        | ||d|      }t        | |||      }t	        ||dd|  d| d|        ; y )	Nr@   rA   r?   g|=zwindow_length = z
, order = z, pos = )r=   err_msg)listranger
   r5   r   )r/   orderr   r1   h1h2s         r   compare_coeffs_to_altrL   ]   sk     vU=122 
=%SeK=%SR@&}oZwhseT	

r   c                 d    t        ddd      D ]   }t        |      D ]  }t        |||         " y )Nr      r   r   )rH   rL   )r   r/   rI   s      r   test_sg_coeffs_comparerO   j   s;     q!Q ?=) 	?E!-2>	??r   c                 j   d}d}|dz  }| j                  ddd      }|d   |d   z
  }d|d	z  z  |z
  }t        ||| 
      }| j                  t        t	        |      t	        |                  }t        |||  |||         d|dz  z  dz
  }	t        ||d||       }| j                  t        t	        |      t	        |                  }
t        |
||  |	||         d|z  }t        ||d||       }| j                  t        t	        |      t	        |                  }t        |||  |||         y )Nr>   	   r   r      +   r         ?r   r   g      ?)derivdeltar         @)linspacer
   r!   r	   r   r   )r   r0   r/   halflenxrV   yr4   y0dyy1d2yy2s                r   test_sg_coeffs_exactra   r   sU   IMq G
Ar2AaD1Q4KE
 	a1fqAmY26A	J035Fq5IJ	KBBwx(!GWH*=> 
qAv	BmYauLA	J035Fq5IJ	KBBwx("WgX*>? 'CmYauLA	J035Fq5IJ	KBBwx(#gwh*?@r   c           
         | j                  g d| j                        }|dz  dz  }|dz  }| j                  |d      }t        |j                  d         D ]s  }t        dd|d	d
|       }t        ||z  ||   d       t        dd|d	d
d|       }t        ||z  ||   d       t        dd|d	d
d|       }t        ||z  ||   d       u y )N)g       r:          @      @g      @r8   r   r>   rT   r   r   r   rc   r@   )r1   rV   rB   r   r;   r<   r   )r1   rV   rB   rU   r   )r!   rC   	full_likerH   shaper
   r   )	r   irZ   dxd2xr1   coeffs0coeffs1coeffs2s	            r   test_sg_coeffs_derivrm      s     	

-RZZ
@A	Q
A	
QB
,,q#
CQWWQZ  <1#SeK!QsV%81#Se1QST!RW591#Se1QST!c#hU;<r   c                     t        ddd|       }t        || j                  d| j                               t        ddd|       }t        || j                  d| j                               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   )r0   rU   r   r8   r   r>   r   N)r
   r   zerosrC   )r   coeffss     r   !test_sg_coeffs_deriv_gt_polyorderrq      sZ     1r:FFBHHQbjjH9:1r:FFBHHQbjjH9:r   torchz4torch loses precision (worse with f32 default dtype)c                     t        dd|       }t        || j                  |      t        |       rdnd       t        ddd|       }t        || j                  |       t        |       rd	       y d       y )
N   rQ   r   gMb@?gTqs*>r<   r   )rU   r   g~jt?)r
   r   flipr   )r   rj   rk   s      r   test_sg_coeffs_largerv      sm     Bb)G!& Br2G"'''""8B<EKr   c                    g d}|D ]/  }t        |dd|       }t        || j                  |      |z         1 d }d }|D ]
  }|dz  }t        | dz   |dz         D cg c]  } |||       c}d d d   }| j	                  || j
                  	      }t        |dd|       }	t        |	|       t        |dd|       }	t        |	|       t        | dz   |dz         D cg c]  } |||       c}d d d   }| j	                  || j
                  	      }t        |dd|       }	t        |	|       t        |d
d|       }	t        |	|        y c c}w c c}w )N)r>   r   rN   r             r   r   c                 <    d| dz
  z  d|z  dz   |z  d|z  dz
  z  z  S )Nr   rT   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   rx   rT   r>   r|   )r}   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   r8   r   )r
   r   	ones_likerH   r!   rC   )
r   window_lengthslengthh_p_dr~   r   r   r}   expected_outputactual_outputs
             r   !test_sg_coeffs_even_window_lengthr      s~    /N  =far2r||E2V;<=3
 ! 8AI$)1"q&!a%$8:  /q!4 ::>B$@**_BJJ*G%far:7%far:7 %*1"q&!a%$8:  /q!4 ::>B$@**_BJJ*G%far:7%far:7!8::s   E Ec                    | j                  dg      }t        |dd      }t        || j                  dg             | j                  dg      }t        |ddd      }t        || j                  dg      d	       | j                  dg      }t        |ddd
      }t        || j                  dg      d	       | j                  dgdz        }t        |ddd      }t        || j                  g d      d	       y)z2 Test some trivial edge cases for savgol_filter().r7   r   r   rW   r   constantmodeg [n<r<   nearestwrap)r7   r7   r7   N)r!   r   r   r   r   rZ   r[   s      r   test_sg_filter_trivialr      s     	

C5AaAAArzz3%()
 	

C5AaAJ/AArzz3%(w7


C5AaAI.AArzz3%(w7


C519AaAF+AArzz/2Ar   c                 2   | j                  g d      }t        |ddd      }t        || j                  g d             t        |ddd      }t        || j                  g d             t        |ddd	      }t        || j                  g d
             y )Nr7   rc   r7   r   r   r   r   r7   UUUUUU?r7   mirror)竪?r   r   r   )r   r   r   )r!   r   r   r   s      r   test_sg_filter_basicr     s~     	

?#AaAJ/AArzz"567aAH-AArzz"=>?aAF+AArzz"=>?r   c                     | j                  g dg dg      }| j                  g dg dg      }t        |ddd      }t        ||       t        |j                  dddd	
      }t        ||j                         y )Nr   )rc   rd   rc   r   )rc   gUUUUUU@rc   r   r   r   r   r   )r   axis)r!   r   r   r#   )r   rZ   r   r[   s       r   test_sg_filter_2dr     sq    


O#% 	&Azz..0 1HaAJ/AAx acc1ajq9AAxzz"r   c           	      &   | j                  ddd| j                        }|d   |d   z
  }| j                  |d|dz  z  |dz  |z
  g      }| j                  | j                  |      d	|z  d|dz  z  d
z
  g      }| j                  | j	                  |      | 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   rR   r8   r   r   r   r   r   r7   r   r   interp)r   r   g-q=r<   r   r   rU   rV   )	rX   rC   stackr   
zeros_likere   r   r   r#   )
r   r2   rV   rZ   rh   ri   r/   r[   r^   r`   s
             r   test_sg_filter_interp_edgesr      s    	B2RZZ0A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           	         | j                  ddd      }|d   |d   z
  }| j                  || g      }| j                  |dz  d|dz  z  dz   g      }| j                  |dz  d|dz  z  |dz  z   d|z  z
  g      }| j                  | j                  |      | j                  |       g      }| j                  d|z  d	|z  g      }| j                  d|dz  z  d	|dz  z  d|z  z   dz
  g      }| j                  |||g      }	| j                  |||g      }
t        |	d
ddd|      }t	        ||	d       t        |	d
dddd|      }t	        ||
d       | j                  |j
                  |j
                  |j
                  g      }	| j                  |j
                  |j
                  |j
                  g      }
t        |	d
ddd|      }t	        ||	d       t        |	d
dddd|      }t	        ||
d       | j                  t        |	dd|       d      }	| j                  t        |
dd|       d      }
t        |	d
ddd|      }t	        ||	d       t        |	d
dddd|      }t	        ||
d       y )Nr   r   rR   r   r   r   r   rT   r   r   r   r   )r   r   rV   r;   r<   r   r   T)copy)rX   r   r   r   r   r#   r!   r   )r   r2   rV   x1x2x3dx1dx2dx3zdzr[   r]   s                r   test_sg_filter_interp_edges_3dr   R  sp    	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' 	

;q!Q2.T
:A	KAqR0t	<BaAAHEBAAqu%	q!QQXQe	LBB'r   c                 b   | 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/   r0   r   zwindow_length must be less than)matchrt   NrQ   r   )r/   r0   r   r      )onesr   pytestraises
ValueError)r   rZ   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"%B.)'r   numpyr)   scipy._lib._array_apir   r   r   r   r   r   scipy.ndimager	   scipy.signalr
   r   scipy.signal._savitzky_golayr   markskip_xp_backendsxfail_xp_backends
pytestmarkr   uses_xp_capabilitiesr'   r5   rD   rL   rO   ra   rm   rq   rv   r   r   r   r   r   r   r   r|   r   r   <module>r      s     
 % 5 1;;// KK11 [[))8 * 

"
 !!%	!:
 ;
8$ =!T "T$

 =!? "? =!A "A: =!< "<  =!
; "
; J =! "$ =!"8 ""8P =!B "B, =!
@ "
@ =!	# "	# =!.) ".)b =!'( "'(T =!O "Or   