
    S_f,                     x    d dl Zd dlmZmZ d dlmZmZmZ d dlZd dlm	Z
 d dlmZ  G d d      Z G d d      Zy)	    N)assert_equalassert_allclose)assert_assert_almost_equalassert_array_almost_equal)raisesc                   f    e 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)TestEntropyc                     g d}g d}t        j                  ||      }t        j                  ||      }t        d|k(         t        |dk\         y )N)      ?皙?333333?)皙?g      ?g?        )statsentropyr   )selfpkqkeselfedoubles        >lib/python3.12/site-packages/scipy/stats/tests/test_entropy.pytest_entropy_positivez!TestEntropy.test_entropy_positive   sD    b"%--B'u3    c                    t        j                  dt              }t        j                  |d      }t        t        |dz
        dk         t        j                  dt              }d|d d t        j                  ||      }t        j                  ||d      }t        t        ||z  t        j                  d      z
        dk         y )N   g       @baseg      @gh㈵>   )nponesfloatr   r   r   abslog)r   r   Sr   S2s        r   test_entropy_basezTestEntropy.test_entropy_base   s    WWRMM"2&AFe#$WWR2AMM"b!]]2r+AbD266":%&./r   c                 J    t        t        j                  g d      dd       y )N)r         g R^?   )decimal)r   r   r   )r   s    r   test_entropy_zerozTestEntropy.test_entropy_zero!   s    EMM)46I$&	(r   c                 t    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       y )Nr   r   333333?r   r   gN!0?2?r   r   r   r   r   r   s      r   test_entropy_2dzTestEntropy.test_entropy_2d&   sO    Cj3*sCj1Cj3*sCj1!%--B"7#,j"9	;r   c                     ddgddgddgg}ddgddgddgg}t        t        j                  ||      t        j                  dg       d|d   d<   t        t        j                  ||      d	dg       y )
Nr   r   r/   r   r   r   r0   r   g^fTF?)r   r   r   r    infr2   s      r   test_entropy_2d_zeroz TestEntropy.test_entropy_2d_zero,   s    Cj3*sCj1Cj3*sCj1!%--B"7#%66:"6	8 1a!%--B"7#-z":	<r   c                 `    ddgddgddgg}t        t        j                  |d      g d       y )	Nr   r   r/   r   r   r)   axis)R^?r:   gD%+?r1   r   r   s     r   $test_entropy_base_2d_nondefault_axisz0TestEntropy.test_entropy_base_2d_nondefault_axis6   s3    Cj3*sCj1!%--";"F	Hr   c                 x    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       y )	Nr   r   r/   r   r   r)   r8   ).c}?r>   gaX?r1   r2   s      r   test_entropy_2d_nondefault_axisz+TestEntropy.test_entropy_2d_nondefault_axis;   sM    Cj3*sCj1Cj3*sCj1!%--BQ"?"@	Br   c                 j    ddgddgddgg}ddgddgg}t        t        t        j                  ||       y )Nr   r   r/   r   r   )assert_raises
ValueErrorr   r   r2   s      r   test_entropy_raises_value_errorz+TestEntropy.test_entropy_raises_value_errorA   s>    Cj3*sCj1Cj3*%j%--R8r   c                     ddgddgddgg}t        t        j                  |d      t        j                  |             y Nr   r   r/   r   r   r   r8   r1   r;   s     r   1test_base_entropy_with_axis_0_is_equal_to_defaultz=TestEntropy.test_base_entropy_with_axis_0_is_equal_to_defaultF   s;    Cj3*sCj1!%--";"'--"3	5r   c                     ddgddgddgg}ddgddgddgg}t        t        j                  ||d      t        j                  ||             y rE   r1   r2   s      r   ,test_entropy_with_axis_0_is_equal_to_defaultz8TestEntropy.test_entropy_with_axis_0_is_equal_to_defaultK   sW    Cj3*sCj1Cj3*sCj1!%--BQ"?"'--B"7	9r   c                     t        j                  ddgddgddgg      }t        t        j                  |j
                        j
                  t        j                  |d             y Nr   r   r/   r   r   r)   r8   r    arrayr   r   r   Tr;   s     r   test_base_entropy_transposedz(TestEntropy.test_base_entropy_transposedQ   sN    XXSzC:Sz:;!%--"5"7"7"'--";	=r   c                 $   t        j                  ddgddgddgg      }t        j                  ddgddgddgg      }t        t        j                  |j
                  |j
                        j
                  t        j                  ||d             y rJ   rK   r2   s      r   test_entropy_transposedz#TestEntropy.test_entropy_transposedV   sx    XXSzC:Sz:;XXSzC:Sz:;!%--bdd";"="="'--BQ"?	Ar   c                    t         j                  j                  d       t         j                  j                  d      }t         j                  j                  dd      }t        j                  ||d      }t        |d   t        j                  ||d                t        |d   t        j                  ||d                y )Nr      r*   r)   r8   )r    randomrandr   r   r   )r   xyress       r   test_entropy_broadcastingz%TestEntropy.test_entropy_broadcasting\   s    
		qIINN1IINN1a mmAqr*SVU]]1ad34SVU]]1ad34r   c                    t         j                  j                  ddd      }t         j                  j                  dd      }d}t        j                  t
        |      5  t        j                  ||       d d d        y # 1 sw Y   y xY w)N
   r)   r+      r*   z/Array shapes are incompatible for broadcasting.matchr    rT   rU   pytestr   rB   r   r   )r   rV   rW   messages       r   test_entropy_shape_mismatchz'TestEntropy.test_entropy_shape_mismatchd   sb    IINN2q"%IINN2q!C]]:W5 	 MM!Q	  	  	 s   A??Bc                     t         j                  j                  d      }d}t        j                  t
        |      5  t        j                  |d       d d d        y # 1 sw Y   y xY w)Nr[   z!`base` must be a positive number.r]   r   r_   r   rV   ra   s      r   test_input_validationz!TestEntropy.test_input_validationk   sJ    IINN25]]:W5 	&MM!"%	& 	& 	&s   AA'N)__name__
__module____qualname__r   r'   r-   r3   r6   r<   r?   rC   rF   rH   rN   rP   rY   rb   rf    r   r   r
   r
      sP     	0(
;<H
B9
5
9=
A5 &r   r
   c                      e Zd ZdZd Zd Zd Zd Zd Zd Z	e
j                  j                  dg d	      d
        ZdddddZe
j                  j                  d eej!                                     d        ZdddddZe
j                  j                  d eej!                                     d        Z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                 F   t         j                  j                  d      }|j                  d      }t	        j
                  |d      }t        |dd       t	        j
                  |dd	      }t        |d
d       t	        j
                  |dd	      }t        |dd       y )Nr   d   vasicekmethodd{?ư>rtolr)   )window_lengthrq   h?r   À%?r    rT   RandomStatestandard_normalr   differential_entropyr   r   random_statevaluesr   s       r   !test_differential_entropy_vasicekz9TestDifferentialEntropy.test_differential_entropy_vasicek}   s    yy,,Q/--c2,,VIF5,,V14=?5,,V14=?5r   c                 X   t         j                  j                  d      }|j                  d      }t	        j
                  |dd      }t        |g dd       t	        j
                  |ddd	      }t        |g d
d       t	        j
                  |ddd	      }t        |g dd       y )Nr   rR   rn   r)   ro   )r9   rq   )rr   g.x?gOjM?rs   rt   )r9   rv   rq   )rw   g\?g:?r   )rx   gpj?g80Qd?ry   r}   s       r   4test_differential_entropy_vasicek_2d_nondefault_axiszLTestDifferentialEntropy.test_differential_entropy_vasicek_2d_nondefault_axis   s    yy,,Q/--h7,,V!IN*	
 ,,V!14=?*	
 ,,V!14=?*	
r   c                 D   t         j                  j                  d      }|j                  d      }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)   rS   r*   )rv   sample_sizer]   )rv   r9   )
r    rT   rz   r{   shapeformatrA   rB   r   r|   )r   r~   r   	error_strr   rv   formatted_error_strs          r   ,test_differential_entropy_raises_value_errorzDTestDifferentialEntropy.test_differential_entropy_raises_value_error   s    yy,,Q/--h7< 	
 ll1o ![!^[A 	M"+"2"2+' #3 #
 z1DE **"/ 	 s   2BB	c                     t         j                  j                  d      }|j                  d      }t	        j
                  |d      }t	        j
                  |      }t        ||       y )Nr   )rn   rR   r8   ry   )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   sR    yy,,Q/--h7,,V!<44V<1r   c                     t         j                  j                  d      }|j                  d      }t	        t        j                  |j                        j                  t        j                  |d             y )Nr   r   r)   r8   )r    rT   rz   r{   r   r   r|   rM   )r   r~   r   s      r   )test_base_differential_entropy_transposedzATestDifferentialEntropy.test_base_differential_entropy_transposed   sV    yy,,Q/--h7&&vxx022&&vA6	
r   c                 f   t         j                  j                  d      }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)	Nr[   z+`base` must be a positive number or `None`.r]   rd   r   z`method` must be one of...z	ekki-ekkirp   )r    rT   rU   r`   r   rB   r   r|   re   s      r   rf   z-TestDifferentialEntropy.test_input_validation   s    IINN2?]]:W5 	3&&qr2	3 /]]:W5 	>&&q=	> 	>		3 	3	> 	>s   B:B'B$'B0rq   )ro   van esebrahimicorreac                     |dk(  rdnd}t         j                  j                  |d      }t         j                  j                         }t        j                  ||      }t        ||d       y )	Nr   '  i@B r   sizer~   rp   {Gzt?rt   )r   normrvsr   r|   r   )r   rq   nr   expectedrX   s         r   test_consistencyz(TestDifferentialEntropy.test_consistency   sX     x'EWjjnn!!n4::%%'((V<XE2r   )gMbX?灕Cl?)gA`"?g)\(?)gHzG?gy&1?)gMb?r   )ro   r   r   r   zmethod, expectedc                    d\  }}}|\  }}t         j                  j                  ||fd      }t         j                  j                         }	t        j                  |||d      }
t        t        j                  t        j                  |
|	z
  dz              |d       t        t        j                  |
      |d	       y 
N)r   2      r   r   rS   )rv   rq   r9   r*   r   )atolgMb`?)
r   r   r   r   r|   r   r    sqrtmeanstdr   rq   r   repsr   mrmse_expectedstd_expectedr   true_entropyrX   s              r   test_norm_rmse_stdz*TestDifferentialEntropy.test_norm_rmse_std   s     "
a&.#|jjnn4)!n<zz))+((A06RA|);a(? @A%E	3s\>r   )gE?l?)gx?gOn?)gףp=
?g~jt?)gS?r   c                    d\  }}}|\  }}t         j                  j                  ||fd      }t         j                  j                         }	t        j                  |||d      }
t        t        j                  t        j                  |
|	z
  dz              |d       t        t        j                  |
      |d	       y r   )
r   exponr   r   r|   r   r    r   r   r   r   s              r   test_expon_rmse_stdz+TestDifferentialEntropy.test_expon_rmse_std  s     "
a&.#|kkooD!91o={{**,((A06RA|);a(? @A%E	3s\>r   z	n, method))r   r   )r+   r   )i  ro   c                     t         j                  j                  |fd      }t        j                  |      }t        j                  ||      }||k(  sJ y )Nr   r   rp   )r   r   r   r|   )r   r   rq   r   res1res2s         r   test_method_autoz(TestDifferentialEntropy.test_method_auto  sJ     jjnn1$Qn7))#.))#f=t||r   N)rg   rh   ri   __doc__r   r   r   r   r   rf   r`   markparametrizer   norm_rmse_std_caseslistitemsr   expon_rmse_std_casesr   r   rj   r   r   rl   rl   r   s   6 
622
	> [[X (> ?3?3 '5%3%3'5	 [[/!"5";";"=>@?@?  (6&4&4(6	 [[/!"6"<"<">?A?A? [[[ +> ??r   rl   )numpyr    numpy.testingr   r   r   r   r   r`   r   rA   scipy.statsr   r
   rl   rj   r   r   <module>r      s9     76 6  * c& c&Ll lr   