o
    Ö­j�6  ã                   @   s¤   d dl Z d dlZd dlmZ d dlZd dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZmZmZ d dlmZmZmZ G dd	„ d	ƒZeej d
¡G dd„ dƒƒƒZdS )é    N)Úraises)Ústats)ÚnormÚexpon)Úarray_api_compatible)Úarray_namespaceÚis_array_api_strictÚis_jax)Úxp_assert_closeÚxp_assert_equalÚxp_assert_lessc                   @   sÀ   e Zd Zedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZed	d
„ ƒZedd„ ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZdS ) ÚTestEntropyc                 C   sZ   |  g d¢¡}|  g d¢¡}t ||¡}t ||¡}t||  d¡ƒ t| |  d¡ƒ d S )N)ç      à?çš™™™™™É?ç333333Ó?)çš™™™™™¹?g      Ð?gÍÌÌÌÌÌä?ç        )Úasarrayr   Úentropyr   r   )ÚselfÚxpÚpkÚqkÚeselfÚedouble© r   ú[/var/www/html/CropPilot/venv/lib/python3.10/site-packages/scipy/stats/tests/test_entropy.pyÚtest_entropy_positive   s   z!TestEntropy.test_entropy_positivec                 C   sž   |  d¡}tj|dd�}t| |d ¡| d¡ƒ |  d¡}| | d¡dk | d¡|¡}t ||¡}tj||dd�}t| || t 	d¡ ¡| d¡ƒ d S )Né   ç       @©Úbaseg      @gñhãˆµøä>é   )
Úonesr   r   r   Úabsr   ÚwhereÚarangeÚmathÚlog)r   r   r   ÚSr   ÚS2r   r   r   Útest_entropy_base   s   

(zTestEntropy.test_entropy_basec                 C   s(   |  g d¢¡}tt |¡|  d¡ƒ d S )N)r   ç      ð?r   g ŠöR^ä?©r   r
   r   r   )r   r   Úxr   r   r   Útest_entropy_zero%   s   
ÿzTestEntropy.test_entropy_zeroc                 C   sX   |  ddgddgddgg¡}|  ddgddgddgg¡}tt ||¡|  ddg¡ƒ d S )Nr   r   ç333333ã?r   r   gN!ü0ç¾È?çÈó2íÒÇ?r-   ©r   r   r   r   r   r   r   Útest_entropy_2d,   s
   ÿzTestEntropy.test_entropy_2dc                 C   s’   |  ddgddgddgg¡}|  ddgddgddgg¡}tt ||¡|  |jdg¡ƒ |  ddgddgddgg¡}tt ||¡|  ddg¡ƒ d S )	Nr   r   r0   r   r   r   r1   g¯^fTðFÆ?)r   r
   r   r   Úinfr2   r   r   r   Útest_entropy_2d_zero3   s   ÿÿz TestEntropy.test_entropy_2d_zeroc                 C   s>   |  ddgddgddgg¡}ttj|dd�|  g d¢¡ƒ d S )	Nr   r   r0   r   r   é   ©Úaxis)çæòöR^ä?r9   gD%¬†+å?r-   ©r   r   r   r   r   r   Ú$test_entropy_base_2d_nondefault_axis>   s   ÿz0TestEntropy.test_entropy_base_2d_nondefault_axisc                 C   s\   |  ddgddgddgg¡}|  ddgddgddgg¡}ttj||dd�|  g d¢¡ƒ d S )	Nr   r   r0   r   r   r6   r7   )ç{[<þ“Í?r<   g¾C8¯XÀ?r-   r2   r   r   r   Útest_entropy_2d_nondefault_axisD   s
   ÿz+TestEntropy.test_entropy_2d_nondefault_axisc                 C   sv   |  ddgddgddgg¡}|  ddgddgg¡}d}tjt|d�� t ||¡ W d   ƒ d S 1 s4w   Y  d S )Nr   r   r0   r   r   ú/Array shapes are incompatible for broadcasting.©Úmatch)r   Úpytestr   Ú
ValueErrorr   r   )r   r   r   r   Úmessager   r   r   Útest_entropy_raises_value_errorK   s   "ÿz+TestEntropy.test_entropy_raises_value_errorc                 C   s:   |  ddgddgddgg¡}ttj|dd�t |¡ƒ d S ©Nr   r   r0   r   r   r   r7   r-   r:   r   r   r   Ú1test_base_entropy_with_axis_0_is_equal_to_defaultS   s   ÿz=TestEntropy.test_base_entropy_with_axis_0_is_equal_to_defaultc                 C   sZ   |  ddgddgddgg¡}|  ddgddgddgg¡}ttj||dd�t ||¡ƒ d S rE   r-   r2   r   r   r   Ú,test_entropy_with_axis_0_is_equal_to_defaultY   s
   
ÿz8TestEntropy.test_entropy_with_axis_0_is_equal_to_defaultc                 C   s<   |  ddgddgddgg¡}tt |j¡tj|dd�ƒ d S ©Nr   r   r0   r   r   r6   r7   ©r   r
   r   r   ÚTr:   r   r   r   Útest_base_entropy_transposed`   s   ÿz(TestEntropy.test_base_entropy_transposedc                 C   s^   |  ddgddgddgg¡}|  ddgddgddgg¡}tt |j|j¡tj||dd�ƒ d S rH   rI   r2   r   r   r   Útest_entropy_transposedf   s
   ÿz#TestEntropy.test_entropy_transposedc                 C   st   t j d¡}| | d¡¡}| | d¡¡}tj||dd�}t|d t ||d ¡ƒ t|d t ||d	 ¡ƒ d S )
Nl   Ü@”UáC<é   )é   r6   éÿÿÿÿr7   r   )r   .r6   )r6   .)ÚnpÚrandomÚdefault_rngr   r   r   r   )r   r   Úrngr.   ÚyÚresr   r   r   Útest_entropy_broadcastingm   s   z%TestEntropy.test_entropy_broadcastingc                 C   sX   |  d¡}|  d¡}d}tjt|d�� t ||¡ W d   ƒ d S 1 s%w   Y  d S )N)é
   r6   é   )é   rN   r>   r?   ©r#   rA   r   rB   r   r   )r   r   r.   rT   rC   r   r   r   Útest_entropy_shape_mismatchv   s   

"ÿz'TestEntropy.test_entropy_shape_mismatchc                 C   sP   |  d¡}d}tjt|d�� tj|dd� W d   ƒ d S 1 s!w   Y  d S )NrW   z!`base` must be a positive number.r?   éþÿÿÿr    rZ   ©r   r   r.   rC   r   r   r   Útest_input_validation~   s
   
"ÿz!TestEntropy.test_input_validationN)Ú__name__Ú
__module__Ú__qualname__r   r   r+   r/   r3   r5   r;   r=   rD   rF   rG   rK   rL   rV   r[   r^   r   r   r   r   r      s>    
	













r   Úskip_xp_backendsc                   @   s$  e Zd ZdZdd„ Zdd„ Zdd„ Zejj	dd	d
�dd„ ƒZ
ejj	dd	d
�dd„ ƒZdd„ Zej dg d¢¡dd„ ƒZdddddœZdddddœZeeeeiZej dg d¢¡ej deeg¡dd „ ƒƒZej d!g d"¢¡d#d$„ ƒZejj	dd	d
�ej dg d¢¡ej d%g d&¢¡d'd(„ ƒƒƒZd)S )*ÚTestDifferentialEntropyzº
    Vasicek results are compared with the R package vsgoftest.

    # library(vsgoftest)
    #
    # samp <- c(<values>)
    # entropy.estimate(x = samp, window = <window_length>)

    c                 C   s†   t j d¡}| d¡}| | ¡ ¡}tj|dd�}t|| d¡ƒ tj|ddd�}t|| d¡ƒ tj|d	dd�}t|| d
¡ƒ d S )Nr   éd   Úvasicek©Úmethodç- ô{õ?r6   )Úwindow_lengthrg   ç¡ €˜äóñ?r"   ç=£&—õ?©	rP   rQ   ÚRandomStateÚstandard_normalr   Útolistr   Údifferential_entropyr
   )r   r   Úrandom_stateÚvaluesr   r   r   r   Ú!test_differential_entropy_vasicek“   s   
ÿÿz9TestDifferentialEntropy.test_differential_entropy_vasicekc                 C   s¤   t j d¡}| d¡}| | ¡ ¡}tj|ddd�}| g d¢¡}t||ƒ tj|dddd�}| g d¢¡}t||ƒ tj|dd	dd�}| g d
¢¡}t||ƒ d S )Nr   ©rM   rd   r6   re   )r8   rg   )rh   gUZdpxõ?gEÄ7ÿL³ô?)r8   ri   rg   )rj   gzGÃÀ¨¥ñ?gt¤Åèò?r"   )rk   gl+ÛÉ�jõ?g×o4d­ô?rl   )r   r   rq   rr   r   Úrefr   r   r   Ú4test_differential_entropy_vasicek_2d_nondefault_axis¤   s    


ÿ

ÿzLTestDifferentialEntropy.test_differential_entropy_vasicek_2d_nondefault_axisc              	   C   s–   t j d¡}| d¡}| | ¡ ¡}d}|jd }dd|d |hD ]'}|j||d�}tt	|d�� t
j||dd	� W d   ƒ n1 sCw   Y  q!d S )
Nr   rt   zhWindow length \({window_length}\) must be positive and less than half the sample size \({sample_size}\).r6   rO   rN   )ri   Úsample_sizer?   )ri   r8   )rP   rQ   rm   rn   r   ro   ÚshapeÚformatÚassert_raisesrB   r   rp   )r   r   rq   rr   Ú	error_strrw   ri   Úformatted_error_strr   r   r   Ú,test_differential_entropy_raises_value_error¸   s(   
ÿ
þýÿ€ùzDTestDifferentialEntropy.test_differential_entropy_raises_value_errorz	jax.numpyz#JAX doesn't support item assignment)Úreasonc                 C   sJ   t j d¡}| d¡}| | ¡ ¡}tj|dd�}t |¡}t||ƒ d S )Nr   )rd   rM   r7   rl   )r   r   rq   rr   r   Údefault_entropyr   r   r   Ú>test_base_differential_entropy_with_axis_0_is_equal_to_defaultÒ   s   

zVTestDifferentialEntropy.test_base_differential_entropy_with_axis_0_is_equal_to_defaultc                 C   sD   t j d¡}| d¡}| | ¡ ¡}tt |j	¡tj|dd�ƒ d S )Nr   rt   r6   r7   )
rP   rQ   rm   rn   r   ro   r
   r   rp   rJ   )r   r   rq   rr   r   r   r   Ú)test_base_differential_entropy_transposedÝ   s   

þzATestDifferentialEntropy.test_base_differential_entropy_transposedc                 C   s    t j d¡}| | ¡ ¡}d}tjt|d�� tj	|dd� W d   ƒ n1 s(w   Y  d}tjt|d�� tj	|dd� W d   ƒ d S 1 sIw   Y  d S )	NrW   z+`base` must be a positive number or `None`.r?   r\   r    z`method` must be one of...z	ekki-ekkirf   )
rP   rQ   Úrandr   ro   rA   r   rB   r   rp   r]   r   r   r   r^   é   s   ÿ"ÿz-TestDifferentialEntropy.test_input_validationrg   )re   úvan esÚebrahimiÚcorreac                 C   s˜   t |ƒr|dkrt d¡ nt|ƒr|dkrt d¡ |dkr!dnd}tjj|dd�}| | ¡ ¡}| t	tj 
¡ ƒ¡}tj||d	�}t||d
d� d S )Nr„   úNeeds array assignment.r…   úNeeds fancy indexing.é'  i@B r   ©Úsizerq   rf   ç{®Gázt?)Úrtol)r	   rA   Úxfailr   r   r   Úrvsr   ro   Úfloatr   rp   r
   )r   rg   r   ÚnrŽ   ÚexpectedrU   r   r   r   Útest_consistencyõ   s   
z(TestDifferentialEntropy.test_consistency)gòÒMbXÉ?ç�•C‹lç»?)g‰A`åÐ"Ë?g)\�Âõ(¼?)gHáz®GÁ?gyé&1¬¼?)gü©ñÒMbÀ?r“   )re   rƒ   r…   r„   )g¢E¶óýÔÈ?ç‹lçû©ñÂ?)g¶óýÔxéÆ?gßO�—nÃ?)g×£p=
×Ã?gÛù~j¼tÃ?)g‡ÙÎ÷SÃ?r”   Údistc                 C   sö   t |ƒr|dkrt d¡ nt|ƒr|dkrt d¡ d\}}}| j| | }| |d ¡| |d ¡}}	|j||fdd�}
| |
 ¡ ¡}
| t| 	¡ ƒ¡}t
j|
||d	d
�}t| | || d ¡¡|dd� t|ƒ}t|j|dd�|	dd� d S )Nr„   r†   r…   r‡   )rˆ   é2   é   r   r6   r‰   rO   )ri   rg   r8   rN   r‹   )Úatol)Ú
correctiongü©ñÒMb`?)r	   rA   r�   r   Úrmse_std_casesr   rŽ   ro   r�   r   r   rp   r
   ÚsqrtÚmeanr   Ústd)r   rg   r•   r   Úrepsr�   Úmr‘   Úrmse_expectedÚstd_expectedrŽ   Útrue_entropyrU   Úxp_testr   r   r   Útest_rmse_std  s$   

ÿÿz%TestDifferentialEntropy.test_rmse_stdz	n, method))r"   rƒ   )rX   r„   )ié  re   c                 C   s`   t |ƒr|dkrt d¡ tjj|fdd�}| | ¡ ¡}t |¡}tj||d�}t	||ƒ d S )Nr„   r†   r   r‰   rf   )
r	   rA   r�   r   r   rŽ   r   ro   rp   r   )r   r�   rg   r   rŽ   Úres1Úres2r   r   r   Útest_method_auto/  s   

z(TestDifferentialEntropy.test_method_autoÚdtype)NÚfloat32Úfloat64c           	      C   s˜   t |ƒr|dkrt d¡ g d¢}t|t|ƒd ƒ}t|t|ƒ| d¡jƒ}tj|j||d�|d�}tj|j||j	d�|d�}t
||j||d�d ƒ d S )Nr…   r‡   )r6   r6   rN   rM   rM   é   é   r¬   é   r—   r"   é	   rW   rY   r,   )r¨   rf   r   )r   rA   r�   ÚgetattrÚstrr   r¨   r   rp   rª   r
   )	r   r   rg   r¨   r.   Údtype_inÚ	dtype_outrU   ru   r   r   r   Útest_dtypes_gh21192;  s   
z+TestDifferentialEntropy.test_dtypes_gh21192N)r_   r`   ra   Ú__doc__rs   rv   r}   rA   Úmarkrb   r€   r�   r^   Úparametrizer’   Únorm_rmse_std_casesÚexpon_rmse_std_casesr   r   rš   r¤   r§   r³   r   r   r   r   rc   †   sP    
ÿ
	ÿ


ü	üÿ
	ÿrc   )r'   rA   r   rz   ÚnumpyrP   Úscipyr   Úscipy.statsr   r   Úscipy.conftestr   Úscipy._lib._array_apir   r   r	   Úscipy._lib._array_api_no_0dr
   r   r   r   rµ   Úusefixturesrc   r   r   r   r   Ú<module>   s    x
