
    e!h6                         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	      Zeej,                  j/                  d
       G d d                    Zy)    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                       e Zd Zed        Zed        Zed        Zed        Zed        Zed        Z	ed        Z
ed        Zed	        Zed
        Zed        Zed        Zed        Zed        Zed        Zy)TestEntropyc                    |j                  g d      }|j                  g d      }t        j                  ||      }t        j                  ||      }t        ||j                  d             t	        | |j                  d             y )N)      ?皙?333333?)皙?g      ?g?        )asarrayr   entropyr   r   )selfxppkqkeselfedoubles         f/var/www/html/diagnosisapp-backend/venv/lib/python3.12/site-packages/scipy/stats/tests/test_entropy.pytest_entropy_positivez!TestEntropy.test_entropy_positive   sg     ZZ(ZZ)*b"%--B'rzz"~.xB0    c                    |j                  d      }t        j                  |d      }t        |j	                  |dz
        |j                  d             |j                  d      }|j                  |j                  d      dk  |j                  d      |      }t        j                  ||      }t        j                  ||d      }t        |j	                  ||z  t        j                  d      z
        |j                  d             y )N          @baseg      @gh㈵>   )
onesr   r   r   absr   wherearangemathlog)r   r   r   Sr   S2s         r   test_entropy_basezTestEntropy.test_entropy_base   s    WWR[MM"2&rvva"f~rzz%'89WWR[XXbiima'B<MM"b!]]2r+rvvadTXXb\12BJJu4EFr    c                     |j                  g d      }t        t        j                  |      |j                  d             y )N)r         ?r#   g R^?r   r   r   r   )r   r   xs      r   test_entropy_zerozTestEntropy.test_entropy_zero%   s2     JJ|$a(

#67	9r    c                     |j                  ddgddgddgg      }|j                  ddgddgddgg      }t        t        j                  ||      |j                  ddg             y )Nr   r   333333?r   r   gN!0?2?r2   r   r   r   r   s       r   test_entropy_2dzTestEntropy.test_entropy_2d,   sj    ZZ#sc3Z#s<=ZZ#sc3Z#s<=b"-

Iz#:;	=r    c                 x   |j                  ddgddgddgg      }|j                  ddgddgddgg      }t        t        j                  ||      |j                  |j                  dg             |j                  ddgddgddgg      }t        t        j                  ||      |j                  ddg             y )	Nr   r   r6   r   r   r   r7   g^fTF?)r   r   r   r   infr8   s       r   test_entropy_2d_zeroz TestEntropy.test_entropy_2d_zero3   s    ZZ#sc3Z#s<=ZZ#sc3Z#s<=b"-

BFFJ#78	: ZZ#sc3Z#s<=b"-

J
#;<	>r    c                     |j                  ddgddgddgg      }t        t        j                  |d      |j                  g d             y )	Nr   r   r6   r   r      axis)R^?rA   gD%+?r2   r   r   r   s      r   $test_entropy_base_2d_nondefault_axisz0TestEntropy.test_entropy_base_2d_nondefault_axis>   sF    ZZ#sc3Z#s<=bq1

#GH	Jr    c                     |j                  ddgddgddgg      }|j                  ddgddgddgg      }t        t        j                  ||d      |j                  g d             y )	Nr   r   r6   r   r   r>   r?   ){[<?rE   gC8X?r2   r8   s       r   test_entropy_2d_nondefault_axisz+TestEntropy.test_entropy_2d_nondefault_axisD   si    ZZ#sc3Z#s<=ZZ#sc3Z#s<=b"15

#GH	Jr    c                     |j                  ddgddgddgg      }|j                  ddgddgg      }d}t        j                  t        |      5  t	        j
                  ||       d d d        y # 1 sw Y   y xY w)Nr   r   r6   r   r   /Array shapes are incompatible for broadcasting.match)r   pytestr   
ValueErrorr   r   )r   r   r   r   messages        r   test_entropy_raises_value_errorz+TestEntropy.test_entropy_raises_value_errorK   st    ZZ#sc3Z#s<=ZZ#sc3Z01C]]:W5 	"MM"b!	" 	" 	"s   A//A8c                     |j                  ddgddgddgg      }t        t        j                  |d      t        j                  |             y Nr   r   r6   r   r   r   r?   r2   rB   s      r   1test_base_entropy_with_axis_0_is_equal_to_defaultz=TestEntropy.test_base_entropy_with_axis_0_is_equal_to_defaultS   sD    ZZ#sc3Z#s<=bq1b)	+r    c                     |j                  ddgddgddgg      }|j                  ddgddgddgg      }t        t        j                  ||d      t        j                  ||             y rP   r2   r8   s       r   ,test_entropy_with_axis_0_is_equal_to_defaultz8TestEntropy.test_entropy_with_axis_0_is_equal_to_defaultY   si    ZZ#sc3Z#s<=ZZ#sc3Z#s<=b"15b"-	/r    c                     |j                  ddgddgddgg      }t        t        j                  |j                        t        j                  |d             y Nr   r   r6   r   r   r>   r?   r   r   r   r   TrB   s      r   test_base_entropy_transposedz(TestEntropy.test_base_entropy_transposed`   sH    ZZ#sc3Z#s<=bdd+bq1	3r    c                     |j                  ddgddgddgg      }|j                  ddgddgddgg      }t        t        j                  |j                  |j                        t        j                  ||d             y rU   rV   r8   s       r   test_entropy_transposedz#TestEntropy.test_entropy_transposedf   sq    ZZ#sc3Z#s<=ZZ#sc3Z#s<=bddBDD1b"15	7r    c                    t         j                  j                  d      }|j                  |j                  d            }|j                  |j                  d            }t	        j
                  ||d      }t        |d   t	        j
                  ||d                t        |d   t	        j
                  ||d	                y )
Nl   @UC<   )   r>   r?   r   )r   .r>   )r>   .)nprandomdefault_rngr   r   r   r   )r   r   rngr3   yress         r   test_entropy_broadcastingz%TestEntropy.test_entropy_broadcastingm   s    ii##$56JJszz!}%JJszz&)*mmAqr*Aa6 ;<Aa6 ;<r    c                     |j                  d      }|j                  d      }d}t        j                  t        |      5  t	        j
                  ||       d d d        y # 1 sw Y   y xY w)N)
   r>      )   r]   rH   rI   r'   rK   r   rL   r   r   )r   r   r3   rc   rM   s        r   test_entropy_shape_mismatchz'TestEntropy.test_entropy_shape_mismatchv   sT    GGK GGGC]]:W5 	 MM!Q	  	  	 s    A  A)c                     |j                  d      }d}t        j                  t        |      5  t	        j
                  |d       d d d        y # 1 sw Y   y xY w)Nrg   z!`base` must be a positive number.rI   r$   rj   r   r   r3   rM   s       r   test_input_validationz!TestEntropy.test_input_validation~   sE    GGBK5]]:W5 	&MM!"%	& 	& 	&s   AAN)__name__
__module____qualname__r   r   r/   r4   r9   r<   rC   rF   rN   rQ   rS   rX   rZ   re   rk   ro    r    r   r   r      s2   1 1 	G 	G 9 9 = = > > J J
 J J " " + +
 / / 3 3
 7 7 = =     & &r    r   skip_xp_backendsc                      e Zd ZdZd Zd Zd Zej                  j                  dd      d        Z
ej                  j                  dd      d	        Zd
 Zej                  j                  dg d      d        ZdddddZdddddZeeeeiZej                  j                  dg d      ej                  j                  deeg      d               Zej                  j                  dg d      d        Zej                  j                  dd      ej                  j                  dg d      ej                  j                  dg d      d                      Zy) TestDifferentialEntropyz
    Vasicek results are compared with the R package vsgoftest.

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

    c                    t         j                  j                  d      }|j                  d      }|j	                  |j                               }t        j                  |d      }t        ||j	                  d             t        j                  |dd      }t        ||j	                  d             t        j                  |d	d      }t        ||j	                  d
             y )Nr   d   vasicekmethod- {?r>   )window_lengthr{    ?r&   =&?	r_   r`   RandomStatestandard_normalr   tolistr   differential_entropyr   )r   r   random_statevaluesr   s        r   !test_differential_entropy_vasicekz9TestDifferentialEntropy.test_differential_entropy_vasicek   s    yy,,Q/--c2FMMO,,,VIF,=!>?,,V14=?,=!>?,,V14=?,=!>?r    c                    t         j                  j                  d      }|j                  d      }|j	                  |j                               }t        j                  |dd      }|j	                  g d      }t        ||       t        j                  |ddd      }|j	                  g d      }t        ||       t        j                  |dd	d      }|j	                  g d
      }t        ||       y )Nr   r\   rx   r>   ry   )r@   r{   )r|   gUZdpx?gE7L?)r@   r}   r{   )r~   gzG?gt?r&   )r   gl+ɍj?go4d?r   )r   r   r   r   r   refs         r   4test_differential_entropy_vasicek_2d_nondefault_axiszLTestDifferentialEntropy.test_differential_entropy_vasicek_2d_nondefault_axis   s    yy,,Q/--h7FMMO,,,V!INjjRS%,,V!14=?jjQR%,,V!14=?jjRS%r    c                    t         j                  j                  d      }|j                  d      }|j	                  |j                               }d}|j                  d   }dd|dz  |hD ]G  }|j                  ||      }t        t        |      5  t        j                  ||d	       d d d        I y # 1 sw Y   TxY w)
Nr   r   zhWindow length \({window_length}\) must be positive and less than half the sample size \({sample_size}\).r>   r^   r]   )r}   sample_sizerI   )r}   r@   )r_   r`   r   r   r   r   shapeformatassert_raisesrL   r   r   )r   r   r   r   	error_strr   r}   formatted_error_strs           r   ,test_differential_entropy_raises_value_errorzDTestDifferentialEntropy.test_differential_entropy_raises_value_error   s    yy,,Q/--h7FMMO,< 	
 ll1o ![!^[A 	M"+"2"2+' #3 #
 z1DE **"/ 	 s   B55B>	z	jax.numpyz#JAX doesn't support item assignment)reasonc                    t         j                  j                  d      }|j                  d      }|j	                  |j                               }t        j                  |d      }t        j                  |      }t        ||       y )Nr   )rx   r\   r?   r   )r   r   r   r   r   default_entropys         r   >test_base_differential_entropy_with_axis_0_is_equal_to_defaultzVTestDifferentialEntropy.test_base_differential_entropy_with_axis_0_is_equal_to_default   sh     yy,,Q/--h7FMMO,,,V!<44V<1r    c                    t         j                  j                  d      }|j                  d      }|j	                  |j                               }t        t        j                  |j                        t        j                  |d             y )Nr   r   r>   r?   )
r_   r`   r   r   r   r   r   r   r   rW   )r   r   r   r   s       r   )test_base_differential_entropy_transposedzATestDifferentialEntropy.test_base_differential_entropy_transposed   sf     yy,,Q/--h7FMMO,&&vxx0&&vA6	
r    c                    t         j                  j                  d      }|j                  |j	                               }d}t        j                  t        |      5  t        j                  |d       d d d        d}t        j                  t        |      5  t        j                  |d       d d d        y # 1 sw Y   GxY w# 1 sw Y   y xY w)	Nrg   z+`base` must be a positive number or `None`.rI   rm   r$   z`method` must be one of...z	ekki-ekkirz   )
r_   r`   randr   r   rK   r   rL   r   r   rn   s       r   ro   z-TestDifferentialEntropy.test_input_validation   s    IINN2JJqxxz"?]]:W5 	3&&qr2	3 /]]:W5 	>&&q=	> 	>		3 	3	> 	>s   B:C:CCr{   )ry   van esebrahimicorreac                    t        |      r|dk(  rt        j                  d       n%t        |      r|dk(  rt        j                  d       |dk(  rdnd}t        j
                  j                  |d      }|j                  |j                               }|j                  t        t        j
                  j                                     }t	        j                  ||	      }t        ||d
       y )Nr   Needs array assignment.r   Needs fancy indexing.'  i@B r   sizer   rz   {Gzt?)rtol)r
   rK   xfailr	   r   r   rvsr   r   floatr   r   r   )r   r{   r   nr   expectedrd   s          r   test_consistencyz(TestDifferentialEntropy.test_consistency   s     ":&J.LL23 $8);LL01x'EWjjnn!!n4jj&::eEJJ$6$6$89:((V<XE2r    )gMbX?灕Cl?)gA`"?g)\(?)gHzG?gy&1?)gMb?r   )ry   r   r   r   )gE?l?)gx?gOn?)gףp=
?g~jt?)gS?r   distc                    t        |      r|dk(  rt        j                  d       n%t        |      r|dk(  rt        j                  d       d\  }}}| j                  |   |   }|j                  |d         |j                  |d         }	}|j                  ||fd      }
|j                  |
j                               }
|j                  t        |j                                     }t        j                  |
||d	
      }t        |j                  |j                  ||z
  dz              |d       t        |      }t        |j!                  |d      |	d       y )Nr   r   r   r   )r   2      r   r>   r   r^   )r}   r{   r@   r]   r   )atol)
correctiongMb`?)r
   rK   r   r	   rmse_std_casesr   r   r   r   r   r   r   r   sqrtmeanr   std)r   r{   r   r   repsr   mr   rmse_expectedstd_expectedr   true_entropyrd   xp_tests                 r   test_rmse_stdz%TestDifferentialEntropy.test_rmse_std  s*    ":&J.LL23 $8);LL01!
a&&t,V4&(jj!&=rzz(ST+?V|hhT1IAh6jj&zz%"78((A06RA|);a(? @A%E	3!#&CA65Qr    z	n, method))r&   r   )rh   r   )i  ry   c                 @   t        |      r|dk(  rt        j                  d       t        j                  j                  |fd      }|j                  |j                               }t        j                  |      }t        j                  ||      }t        ||       y )Nr   r   r   r   rz   )
r
   rK   r   r   r   r   r   r   r   r   )r   r   r{   r   r   res1res2s          r   test_method_autoz(TestDifferentialEntropy.test_method_auto/  sw     ":&J.LL23jjnn1$Qn7jj&))#.))#f=d#r    dtype)Nfloat32float64c                    t        |      r|dk(  rt        j                  d       g d}t        |t	        |      d       }t        |t	        |      |j                  d      j                        }t        j                  |j                  ||      |      }t        j                  |j                  ||j                        |      }t        ||j                  ||      d          y )Nr   r   )r>   r>   r]   r\   r\         r      r   r&   	   rg   ri   r1   )r   rz   rs   )r	   rK   r   getattrstrr   r   r   r   r   r   )	r   r   r{   r   r3   dtype_in	dtype_outrd   r   s	            r   test_dtypes_gh21192z+TestDifferentialEntropy.test_dtypes_gh21192;  s     r"v'9LL0182s5z40BE
BJJrN,@,@A	((AX)FvV((ARZZ)HQWXRZZ9Z=bABr    N)rp   rq   rr   __doc__r   r   r   rK   markrt   r   r   ro   parametrizer   norm_rmse_std_casesexpon_rmse_std_casesr   r   r   r   r   r   rs   r    r   rv   rv      s   @"&(4 [[!!+)N " P2P2 [[!!+)N " P
P

> [[X (> ?3?3 '5%3%3'5	 (6&4&4(6	 /13N [[X'RS[[VdE]3R 4 TR, [[[ +> ?$?$ [[!!+)N " P[[X'RS[[W&BCC D TPCr    rv   )r+   rK   r   r   numpyr_   scipyr   scipy.statsr   r   scipy.conftestr   scipy._lib._array_apir   r	   r
   scipy._lib._array_api_no_0dr   r   r   r   r   usefixturesrv   rs   r    r   <module>r      sn      *   # / N N9 9u& u&p +,BC BC - BCr    