§
    fŠtj|'  ã                   ój   — d dl Z d dlZd dlmZmZ d dlmZm	Z
  G d„ d¦  «        Z G d„ d¦  «        ZdS )é    N)Úassert_equalÚassert_allclose)Ú	_iv_ratioÚ_iv_ratio_cc                   óä  — e Zd Zej                             dg d¢¦  «        d„ ¦   «         Zej                             ddej        dfej        ddfg¦  «        d„ ¦   «         Z	ej                             ddej         ej
        ej        g¦  «        ej                             d	 ej        e¦  «        j          ej        e¦  «        j         ej         ej
        ej        g¦  «        d
„ ¦   «         ¦   «         Zej                             ddd ej        e¦  «        j        ej        g¦  «        d„ ¦   «         Zej                             dd ej        e¦  «        j        fd ej        e¦  «        j        fd ej        e¦  «        j        dz  fd ej        e¦  «        j        df ej        e¦  «        j         ej         ej        e¦  «        j        ¦  «        fg¦  «        d„ ¦   «         Zej                             ddd ej         ej        e¦  «        j        ¦  «         ej        e¦  «        j        fg¦  «        d„ ¦   «         Zej                             d ej        e¦  «        j         ej        e¦  «        j        f ej        e¦  «        j        dz   ej        e¦  «        j        f ej        e¦  «        j         ej        e¦  «        j        dz  fg¦  «        d„ ¦   «         ZdS )ÚTestIvRatioúv,x,r))ç      à?çUUUUUUÅ?g.a0R#Å?)r
   çUUUUUUÕ?gˆ<)ª“Ô?)r
   r
   góŠV×S“Ý?)r
   çUUUUUUå?gPò]k(¦â?)r
   ç¬ªªªªªê?gjDŒ­Õå?)é   ç6Z£5Z£Õ?g&RÍ’®UÅ?)r   çªªªªªªæ?g„‘ùÂZÕ?)r   ç«ªªªªªò?gZrò!à?)r   çÝÝÝÝÝÝý?gŽ4e~u–å?)r   ç}ðÁ|@gG)È¿ë?)ç¸…ëQ¸@ç}ôõ¦P…é?gâ1ÖÜaÅ?)r   çj�6Ðiû?gÖ´N¶`�Õ?)r   ç Ó:m @g9Æ¬Ü7à?)r   çí5’¦T@g÷4¸+ç�å?)r   ç¿ŽÔëH½%@gü¬ñJ]Ðê?)ç¢E¶óýdL@ç€9LŒ;w3@g¤ñž'~VÅ?)r   çä^s!iFE@gì¥Õ/°XÕ?)r   çÙÎ÷SãR@g“_®8à?)r   çP²ÂTø`@g¿ø )Xå?)r   çÿ>ÝïÓ=s@g\h*¬ê?c                 óH   — t          t          ||¦  «        |dd¬¦  «         dS )a“  The reference values are computed using mpmath as follows.

        from mpmath import mp
        mp.dps = 100

        def iv_ratio_mp(v, x):
            return mp.besseli(v, x) / mp.besseli(v - 1, x)

        def _sample(n, *, v):
            '''Return n positive real numbers x such that iv_ratio(v, x) are
            roughly evenly spaced over (0, 1).  The formula is taken from [1].

            [1] Banerjee A., Dhillon, I. S., Ghosh, J., Sra, S. (2005).
                "Clustering on the Unit Hypersphere using von Mises-Fisher
                Distributions."  Journal of Machine Learning Research,
                6(46):1345-1382.
            '''
            r = np.arange(1, n+1) / (n+1)
            return r * (2*v-r*r) / (1-r*r)

        for v in (0.5, 1, 2.34, 56.789):
            xs = _sample(5, v=v)
            for x in xs:
                print(f"({v}, {x}, {float(iv_ratio_mp(v,x))}),")
        ç¼‰Ø—²Ò¼<r   ©ÚrtolÚatolN)r   Úiv_ratio©ÚselfÚvÚxÚrs       ú_/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/scipy/special/tests/test_iv_ratio.pyÚtest_against_reference_valuesz)TestIvRatio.test_against_reference_values   s*   € õ` 	�  A™œ¨°¸AÐ>Ñ>Ô>Ð>Ð>Ð>ó    r   r   c                 óB   — t          t          ||¦  «        |¦  «         dS ©ziIf exactly one of v or x is inf and the other is within domain,
        should return 0 or 1 accordingly.N©r   r&   r'   s       r,   Útest_infzTestIvRatio.test_inf@   s"   € õ 	•X˜a ‘^”^ QÑ'Ô'Ð'Ð'Ð'r.   r)   ç\�Âõ(\ß?r*   c                 óV   — t          t          ||¦  «        t          j        ¦  «         dS ©zeIf at least one argument is out of domain, or if v = x = inf,
        the function should return nan.N)r   r&   ÚnpÚnan©r(   r)   r*   s      r,   Útest_nanzTestIvRatio.test_nanI   s$   € õ 	•X˜a ‘^”^¥R¤VÑ,Ô,Ð,Ð,Ð,r.   r
   c                 ó~   — t          t          |d¦  «        d¦  «         t          t          |d¦  «        d¦  «         dS )z?If x is +/-0.0, return x to ensure iv_ratio is an odd function.ç        ç       €Nr1   ©r(   r)   s     r,   Útest_zero_xzTestIvRatio.test_zero_xR   s>   € õ 	•X˜a Ñ%Ô% sÑ+Ô+Ð+Ý•X˜a Ñ&Ô&¨Ñ-Ô-Ð-Ð-Ð-r.   úv,xé   ©ç@Œµx¯Dé{   c                 óN   — t          t          ||¦  «        d|z  |z  ¦  «         dS )a9  If x is much less than v, the bounds

                    x                                 x
        --------------------------- <= R <= -----------------------
        v-0.5+sqrt(x**2+(v+0.5)**2)         v-1+sqrt(x**2+(v+1)**2)

        collapses to R ~= x/2v.  Test against this asymptotic expression.
        r
   Nr1   r8   s      r,   Útest_tiny_xzTestIvRatio.test_tiny_xX   s*   € õ" 	•X˜a ‘^”^ c¨!¡e¨Q¡YÑ/Ô/Ð/Ð/Ð/r.   ©r   g €à7yÃAC©rB   g¥\Ãñ)c=Hc                 óB   — t          t          ||¦  «        d¦  «         dS )aA  If x is much greater than v, the bounds

                    x                                 x
        --------------------------- <= R <= ---------------------------
        v-0.5+sqrt(x**2+(v+0.5)**2)         v-0.5+sqrt(x**2+(v-0.5)**2)

        collapses to R ~= 1.  Test against this asymptotic expression.
        ç      ð?Nr1   r8   s      r,   Útest_huge_xzTestIvRatio.test_huge_xk   s"   € õ 	•X˜a ‘^”^ SÑ)Ô)Ð)Ð)Ð)r.   é   c                 óˆ   — ||z  }|dt          j        d|¦  «        z   z  }t          t          ||¦  «        |dd¬¦  «         dS )aµ  If both x and v are very large, the bounds

                    x                                 x
        --------------------------- <= R <= -----------------------
        v-0.5+sqrt(x**2+(v+0.5)**2)         v-1+sqrt(x**2+(v+1)**2)

        collapses to R ~= x/(v+sqrt(x**2+v**2).  Test against this asymptotic
        expression, and in particular that no numerical overflow occurs during
        intermediate calculations.
        r   r"   r   r#   N)r6   Úhypotr   r&   ©r(   r)   r*   ÚtÚexpecteds        r,   Útest_huge_v_xzTestIvRatio.test_huge_v_x{   sK   € ð  �‰EˆØ˜�BœH Q¨™NœNÑ*Ñ+ˆÝ�  A™œ¨°uÀ1ÐEÑEÔEÐEÐEÐEr.   N©Ú__name__Ú
__module__Ú__qualname__ÚpytestÚmarkÚparametrizer-   r6   Úinfr2   r7   ÚfinfoÚfloatÚsmallest_normalÚsmallest_subnormalr9   Úmaxr>   ÚsqrtrE   rJ   rQ   © r.   r,   r   r      sY  € € € € € à„[×Ò˜Wð 'ð 'ð 'ñ ô ð,?ð ?ñ-ô ð,?ð8 „[×Ò˜WØ	
ˆBŒF�AˆØ	Œ��Aˆð'ñ ô ð(ð (ñ	ô ð(ð
 „[×Ò˜S 4¨"¬&¨°"´&¸"¼&Ð"AÑBÔBØ„[×Ò˜S H B¤H¨U¡O¤OÔ$CÐ#CØ$, B¤H¨U¡O¤OÔ$FÐ#FØ$&¤F 7¨B¬F°B´Fð#<ñ =ô =ð-ð -ñ=ô =ñ CÔBð-ð
 „[×Ò˜S 3¨¨8¨2¬8°E©?¬?Ô+>ÀÄÐ"GÑHÔHð.ð .ñ IÔHð.ð
 „[×Ò˜UØ	
ˆHˆBŒH�U‰OŒOÔ+Ð,Ø	
ˆHˆBŒH�U‰OŒOÔ.Ð/Ø	
ˆHˆBŒH�U‰OŒOÔ.¨qÑ0Ð1ØØ	ˆŒ�%‰ŒÔ	˜aÐ Ø	ˆŒ�%‰ŒÔ	˜g˜bœg h b¤h¨u¡o¤oÔ&9Ñ:Ô:Ð;ð%ñ ô ð	0ð 	0ñô ð	0ð „[×Ò˜UØØØ	ˆŒ��”˜%‘”Ô$Ñ	%Ô	% x r¤x°¡¤Ô':Ð;ð%ñ ô ð
	*ð 	*ñô ð
	*ð „[×Ò˜UØ	ˆŒ�%‰ŒÔ	˜h˜bœh u™oœoÔ1Ð2Ø	ˆŒ�%‰ŒÔ	˜qÑ	  ( "¤(¨5¡/¤/Ô"5Ð6Ø	ˆŒ�%‰ŒÔ	˜h˜bœh u™oœoÔ1°AÑ5Ð6ð%ñ ô ð
Fð Fñô ð
Fð Fð Fr.   r   c                   óä  — e Zd Zej                             dg d¢¦  «        d„ ¦   «         Zej                             ddej        dfej        ddfg¦  «        d„ ¦   «         Z	ej                             ddej         ej
        ej        g¦  «        ej                             d	 ej        e¦  «        j          ej        e¦  «        j         ej         ej
        ej        g¦  «        d
„ ¦   «         ¦   «         Zej                             ddd ej        e¦  «        j        ej        g¦  «        d„ ¦   «         Zej                             dd ej        e¦  «        j        fd ej        e¦  «        j        fd ej        e¦  «        j        dz  fd ej        e¦  «        j        df ej        e¦  «        j         ej         ej        e¦  «        j        ¦  «        fg¦  «        d„ ¦   «         Zej                             ddd ej         ej        e¦  «        j        ¦  «         ej        e¦  «        j        fg¦  «        d„ ¦   «         Zej                             d ej        e¦  «        j         ej        e¦  «        j        f ej        e¦  «        j        dz   ej        e¦  «        j        f ej        e¦  «        j         ej        e¦  «        j        dz  fg¦  «        d„ ¦   «         ZdS )ÚTestIvRatioCr	   ))r
   r   g{´çs+·ê?)r
   r   gÿ»aë*¶å?)r
   r
   g†ºTV6á?)r
   r   g`D)¯³Ú?)r
   r   g,wç¤ÒUÔ?)r   r   gv«L[”ªê?)r   r   g>7öžRå?)r   r   gLá¼Ùß?)r   r   gä–5ÓÔ?)r   r   gäZ³ß ñÃ?)r   r   gˆ3zÊˆ§ê?)r   r   g•¥Ø¤O?å?)r   r   gŽ÷s¦F�ß?)r   r   g–�¨1ÄÔ?)r   r   gL9ÔŠ¾Ä?)r   r   g—Cv`ªê?)r   r   g
-è§Så?)r   r   gÚ@É£Žùß?)r   r   g‚þ­OÕ?)r   r    g�^V³ßOÅ?c                 óH   — t          t          ||¦  «        |dd¬¦  «         dS )z8The reference values are one minus those of TestIvRatio.çVçž¯Ò<r   r#   N©r   Ú
iv_ratio_cr'   s       r,   r-   z*TestIvRatioC.test_against_reference_values’   s+   € õ0 	�
 1 aÑ(Ô(¨!°%¸aÐ@Ñ@Ô@Ð@Ð@Ð@r.   r   r   c                 óB   — t          t          ||¦  «        |¦  «         dS r0   ©r   rf   r'   s       r,   r2   zTestIvRatioC.test_inf¬   s$   € õ 	•Z  1Ñ%Ô% qÑ)Ô)Ð)Ð)Ð)r.   r)   r3   r*   c                 óV   — t          t          ||¦  «        t          j        ¦  «         dS r5   )r   rf   r6   r7   r8   s      r,   r9   zTestIvRatioC.test_nanµ   s&   € õ 	•Z  1Ñ%Ô%¥r¤vÑ.Ô.Ð.Ð.Ð.r.   r
   c                 ó~   — t          t          |d¦  «        d¦  «         t          t          |d¦  «        d¦  «         dS )zIf x is +/-0.0, return 1.r;   rI   r<   Nrh   r=   s     r,   r>   zTestIvRatioC.test_zero_x¾   s>   € õ 	•Z  3Ñ'Ô'¨Ñ-Ô-Ð-Ý•Z  4Ñ(Ô(¨#Ñ.Ô.Ð.Ð.Ð.r.   r?   r@   rA   c                 óT   — t          t          ||¦  «        dd|z  |z  z
  ¦  «         dS )a=  If x is much less than v, the bounds

                    x                                 x
        --------------------------- <= R <= -----------------------
        v-0.5+sqrt(x**2+(v+0.5)**2)         v-1+sqrt(x**2+(v+1)**2)

        collapses to 1-R ~= 1-x/2v.  Test against this asymptotic expression.
        rI   r
   Nrh   r8   s      r,   rE   zTestIvRatioC.test_tiny_xÄ   s0   € õ" 	•Z  1Ñ%Ô% s¨C°©E°1©9¡}Ñ5Ô5Ð5Ð5Ð5r.   rF   rG   c                 óT   — t          t          ||¦  «        |dz
  |z  dd¬¦  «         dS )aK  If x is much greater than v, the bounds

                    x                                 x
        --------------------------- <= R <= ---------------------------
        v-0.5+sqrt(x**2+(v+0.5)**2)         v-0.5+sqrt(x**2+(v-0.5)**2)

        collapses to 1-R ~= (v-0.5)/x.  Test against this asymptotic expression.
        r
   rd   r   r#   Nre   r8   s      r,   rJ   zTestIvRatioC.test_huge_x×   s3   € õ 	�
 1 aÑ(Ô(¨1¨S©5°!©)¸%ÀaÐHÑHÔHÐHÐHÐHr.   rK   c                 óŽ   — ||z  }d|dt          j        d|¦  «        z   z  z
  }t          t          ||¦  «        |dd¬¦  «         dS )a½  If both x and v are very large, the bounds

                    x                                 x
        --------------------------- <= R <= -----------------------
        v-0.5+sqrt(x**2+(v+0.5)**2)         v-1+sqrt(x**2+(v+1)**2)

        collapses to 1 - R ~= 1 - x/(v+sqrt(x**2+v**2).  Test against this
        asymptotic expression, and in particular that no numerical overflow
        occurs during intermediate calculations.
        r   r"   r   r#   N)r6   rM   r   rf   rN   s        r,   rQ   zTestIvRatioC.test_huge_v_xç   sR   € ð  �‰EˆØ�q˜A¥¤¨¨A¡¤Ñ.Ñ/Ñ/ˆÝ�
 1 aÑ(Ô(¨(¸ÀQÐGÑGÔGÐGÐGÐGr.   NrR   r`   r.   r,   rb   rb   �   s_  € € € € € à„[×Ò˜Wð 'ð 'ð 'ñ ô ð,Að Añ-ô ð,Að „[×Ò˜WØ	
ˆBŒF�AˆØ	Œ��Aˆð'ñ ô ð*ð *ñ	ô ð*ð
 „[×Ò˜S 4¨"¬&¨°"´&¸"¼&Ð"AÑBÔBØ„[×Ò˜S H B¤H¨U¡O¤OÔ$CÐ#CØ$, B¤H¨U¡O¤OÔ$FÐ#FØ$&¤F 7¨B¬F°B´Fð#<ñ =ô =ð/ð /ñ=ô =ñ CÔBð/ð
 „[×Ò˜S 3¨¨8¨2¬8°E©?¬?Ô+>ÀÄÐ"GÑHÔHð/ð /ñ IÔHð/ð
 „[×Ò˜UØ	
ˆHˆBŒH�U‰OŒOÔ+Ð,Ø	
ˆHˆBŒH�U‰OŒOÔ.Ð/Ø	
ˆHˆBŒH�U‰OŒOÔ.¨qÑ0Ð1ØØ	ˆŒ�%‰ŒÔ	˜aÐ Ø	ˆŒ�%‰ŒÔ	˜g˜bœg h b¤h¨u¡o¤oÔ&9Ñ:Ô:Ð;ð%ñ ô ð	6ð 	6ñô ð	6ð „[×Ò˜UØØØ	ˆŒ��”˜%‘”Ô$Ñ	%Ô	% x r¤x°¡¤Ô':Ð;ð%ñ ô ð
	Ið 	Iñô ð
	Ið „[×Ò˜UØ	ˆŒ�%‰ŒÔ	˜h˜bœh u™oœoÔ1Ð2Ø	ˆŒ�%‰ŒÔ	˜qÑ	  ( "¤(¨5¡/¤/Ô"5Ð6Ø	ˆŒ�%‰ŒÔ	˜h˜bœh u™oœoÔ1°AÑ5Ð6ð%ñ ô ð
Hð Hñô ð
Hð Hð Hr.   rb   )rV   Únumpyr6   Únumpy.testingr   r   Úscipy.special._ufuncsr   r&   r   rf   r   rb   r`   r.   r,   ú<module>rq      sÛ   ðð €€€Ø Ð Ð Ð Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7ðð ð ð ð ð ð ð ðAFð AFð AFð AFð AFñ AFô AFð AFðHiHð iHð iHð iHð iHñ iHô iHð iHð iHð iHr.   