Ë
    óÍ:jµ  ã                   óî   — d dl Z d dlmZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZmZ dgZd„ Zg d	¢Zg d
¢Zg d¢Zg d¢ZeegZeegZdd„Zej,                  j.                  d„ «       Z G d„ de	«      Zy)é    N)ÚOptional)ÚTensor)Úconstraints)ÚDistribution)Úbroadcast_allÚlazy_propertyÚVonMisesc                 ór   — t        |«      }|j                  «       }|r|j                  «       | |z  z   }|rŒ|S ©N)ÚlistÚpop)ÚyÚcoefÚresults      úr/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/torch/distributions/von_mises.pyÚ
_eval_polyr      s7   € Ü�‹:€DØ�X‰X‹Z€FÙ
Ø—‘“˜a &™jÑ(ˆò à€Mó    )g      ð?g§Œ$æþ@g¤0”¸3¸@g,–Ç?ØNó?gª2çt´Ñ?gýåIˆ¨x¢?gtHÅZ×Ãr?)	ç Þe3EˆÙ?g�-ÿ¥5‹?gÛÕ’+Hub?gJ‰NÁÐY¿gTÑPŠóÃ‚?gÇý'•¿gãZåðæüš?gULÊ+ß�¿gˆ;ý^p?)ç      à?g§ì‘Yÿì?g(„«�Ézà?gê*öúOÃ?gZƒµ9›?gœå.™•³h?gÓ°­Ù©=5?)	r   g¾þÍ.k¤¿g?Œ”V¨m¿g–tZØOÖZ?gÜ<¯Q …¿gÙ'8©`—?gP“þâ¥�¿gqœ©J:N’?g;PÈJ£4q¿c                 óV  — |dk(  s|dk(  sJ ‚| dz  }||z  }t        |t        |   «      }|dk(  r| j                  «       |z  }|j                  «       }d| z  }| d| j                  «       z  z
  t        |t        |   «      j                  «       z   }t        j                  | dk  ||«      }|S )zX
    Returns ``log(I_order(x))`` for ``x > 0``,
    where `order` is either 0 or 1.
    r   é   g      @r   )r   Ú_COEF_SMALLÚabsÚlogÚ_COEF_LARGEÚtorchÚwhere)ÚxÚorderr   ÚsmallÚlarger   s         r   Ú_log_modified_bessel_fnr"   E   s±   € ð
 �AŠ:˜ !šÐ#Ð#ð 	
ˆD‰€AØ	ˆA‰€AÜ�qœ+ eÑ,Ó-€EØ�‚zØ—‘“˜%‘ˆØ�I‰I‹K€Eð 	ˆq‰€AØ��a—e‘e“g‘Ñ¤
¨1¬k¸%Ñ.@Ó A× EÑ EÓ GÑG€Eä�[‰[˜˜T™ 5¨%Ó0€FØ€Mr   c                 ó6  — t        j                  |j                  t         j                  | j                  ¬«      }|j                  «       �st        j                  d|j                  z   | j                  | j                  ¬«      }|j                  «       \  }}}t        j                  t        j                  |z  «      }	d||	z  z   ||	z   z  }
|||
z
  z  }|d|z
  z  |z
  dkD  ||z  j                  «       dz   |z
  dk\  z  }|j                  «       r>t        j                  ||dz
  j                  «       |
j!                  «       z  |«      }||z  }|j                  «       s�Œ|t        j                  z   | z   dt        j                  z  z  t        j                  z
  S )N©ÚdtypeÚdevice)é   r   é   r   r   )r   ÚzerosÚshapeÚboolr&   ÚallÚrandr%   ÚunbindÚcosÚmathÚpir   Úanyr   ÚsignÚacos)ÚlocÚconcentrationÚ
proposal_rr   ÚdoneÚuÚu1Úu2Úu3ÚzÚfÚcÚaccepts                r   Ú_rejection_samplerA   \   s<  € ä�;‰;�q—w‘w¤e§j¡j¸¿¹ÔD€DØ�h‰h�jÜ�J‰J�t˜aŸg™g‘~¨S¯Y©Y¸s¿z¹zÔJˆØ—X‘X“Z‰
ˆˆB�Ü�I‰I”d—g‘g ‘lÓ#ˆØ�˜a‘Ñ J°¡NÑ3ˆØ˜Z¨!™^Ñ,ˆØ˜˜A™‘; Ñ# qÑ(¨a°"©f¯\©\«^¸aÑ-?À!Ñ-CÀqÑ-HÑIˆØ�:‰:Œ<Ü—‘˜F R¨#¡X§O¡OÓ$5¸¿¹»Ñ$@À!ÓDˆAØ˜&‘=ˆDð �h‰hŽjð ”—‘‰K˜#Ñ !¤d§g¡g¡+Ñ.´·±Ñ8Ð8r   c            	       ór  ‡ — e Zd ZdZej
                  ej                  dœZej
                  ZdZ		 dde
de
dee   ddfˆ fd	„Zd
„ Zede
fd„«       Zede
fd„«       Zede
fd„«       Z ej(                  «        ej*                  «       fd„«       Zdˆ fd„	Zede
fd„«       Zede
fd„«       Zede
fd„«       Zˆ xZS )r	   aX  
    A circular von Mises distribution.

    This implementation uses polar coordinates. The ``loc`` and ``value`` args
    can be any real number (to facilitate unconstrained optimization), but are
    interpreted as angles modulo 2 pi.

    Example::
        >>> # xdoctest: +IGNORE_WANT("non-deterministic")
        >>> m = VonMises(torch.tensor([1.0]), torch.tensor([1.0]))
        >>> m.sample()  # von Mises distributed with loc=1 and concentration=1
        tensor([1.9777])

    :param torch.Tensor loc: an angle in radians.
    :param torch.Tensor concentration: concentration parameter
    )r5   r6   FNr5   r6   Úvalidate_argsÚreturnc                 ó®   •— t        ||«      \  | _        | _        | j                  j                  }t	        j
                  «       }t        ‰| �  |||«       y r   )r   r5   r6   r*   r   ÚSizeÚsuperÚ__init__)Úselfr5   r6   rC   Úbatch_shapeÚevent_shapeÚ	__class__s         €r   rH   zVonMises.__init__‚   sD   ø€ ô (5°S¸-Ó'HÑ$ˆŒ�$Ô$Ø—h‘h—n‘nˆÜ—j‘j“lˆÜ‰Ñ˜ k°=ÕAr   c                 ó   — | j                   r| j                  |«       | j                  t        j                  || j
                  z
  «      z  }|t        j                  dt        j                  z  «      z
  t        | j                  d¬«      z
  }|S )Nr(   r   ©r   )
Ú_validate_argsÚ_validate_sampler6   r   r/   r5   r0   r   r1   r"   )rI   ÚvalueÚlog_probs      r   rR   zVonMises.log_prob�   sy   € Ø×ÒØ×!Ñ! %Ô(Ø×%Ñ%¬¯	©	°%¸$¿(¹(Ñ2BÓ(CÑCˆàÜ�h‰h�qœ4Ÿ7™7‘{Ó#ñ$ä% d×&8Ñ&8ÀÔBñCð 	ð
 ˆr   c                 óT   — | j                   j                  t        j                  «      S r   )r5   Útor   Údouble©rI   s    r   Ú_loczVonMises._loc˜   s   € à�x‰x�{‰{œ5Ÿ<™<Ó(Ð(r   c                 óT   — | j                   j                  t        j                  «      S r   )r6   rT   r   rU   rV   s    r   Ú_concentrationzVonMises._concentrationœ   s   € à×!Ñ!×$Ñ$¤U§\¡\Ó2Ð2r   c                 óê   — | j                   }ddd|dz  z  z   j                  «       z   }|d|z  j                  «       z
  d|z  z  }d|dz  z   d|z  z  }d|z  |z   }t        j                  |dk  ||«      S )Nr   é   r(   gñhãˆµøä>)rY   Úsqrtr   r   )rI   ÚkappaÚtauÚrhoÚ_proposal_rÚ_proposal_r_taylors         r   r`   zVonMises._proposal_r    sˆ   € à×#Ñ#ˆØ�1�q˜5 !™8‘|Ñ#×)Ñ)Ó+Ñ+ˆØ�a˜#‘g—^‘^Ó%Ñ%¨!¨e©)Ñ4ˆØ˜3 ™6‘z a¨#¡gÑ.ˆà ™Y¨Ñ.ÐÜ�{‰{˜5 4™<Ð);¸[ÓIÐIr   c                 óB  — | j                  |«      }t        j                  || j                  j                  | j
                  j                  ¬«      }t        | j                  | j                  | j                  |«      j                  | j
                  j                  «      S )a×  
        The sampling algorithm for the von Mises distribution is based on the
        following paper: D.J. Best and N.I. Fisher, "Efficient simulation of the
        von Mises distribution." Applied Statistics (1979): 152-157.

        Sampling is always done in double precision internally to avoid a hang
        in _rejection_sample() for small values of the concentration, which
        starts to happen for single precision around 1e-4 (see issue #88443).
        r$   )Ú_extended_shaper   ÚemptyrW   r%   r5   r&   rA   rY   r`   rT   )rI   Úsample_shaper*   r   s       r   ÚsamplezVonMises.sampleª   sn   € ð ×$Ñ$ \Ó2ˆÜ�K‰K˜ T§Y¡Y§_¡_¸T¿X¹X¿_¹_ÔMˆÜ Ø�I‰I�t×*Ñ*¨D×,<Ñ,<¸aó
ç
‰"ˆT�X‰X�^‰^Ó
ð	r   c                 ó  •— 	 t         ‰| �  |«      S # t        $ rh | j                  j	                  d«      }| j
                  j                  |«      }| j                  j                  |«      } t        | «      |||¬«      cY S w xY w)NrO   )rC   )rG   ÚexpandÚNotImplementedErrorÚ__dict__Úgetr5   r6   Útype)rI   rJ   Ú	_instancerC   r5   r6   rL   s         €r   rh   zVonMises.expand»   s{   ø€ ð	OÜ‘7‘> +Ó.Ð.øÜ"ò 	OØ ŸM™M×-Ñ-Ð.>Ó?ˆMØ—(‘(—/‘/ +Ó.ˆCØ ×.Ñ.×5Ñ5°kÓBˆMØ”4˜“:˜c =ÀÔNÒNð		Oús   ƒ ’A.BÂBc                 ó   — | j                   S )z8
        The provided mean is the circular one.
        ©r5   rV   s    r   ÚmeanzVonMises.meanÄ   s   € ð
 �x‰xˆr   c                 ó   — | j                   S r   ro   rV   s    r   ÚmodezVonMises.modeË   s   € à�x‰xˆr   c                 ó‚   — dt        | j                  d¬«      t        | j                  d¬«      z
  j                  «       z
  S )z<
        The provided variance is the circular one.
        r   rN   r   )r"   r6   ÚexprV   s    r   ÚvariancezVonMises.varianceÏ   s>   € ð ä'¨×(:Ñ(:À!ÔDÜ)¨$×*<Ñ*<ÀAÔFñGç‰c‹eñ	ð	
r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚrealÚpositiveÚarg_constraintsÚsupportÚhas_rsampler   r   r+   rH   rR   r   rW   rY   r`   r   Úno_gradrF   rf   rh   Úpropertyrp   rr   ru   Ú__classcell__)rL   s   @r   r	   r	   l   s@  ø„ ñð" *×.Ñ.À×AUÑAUÑV€OØ×Ñ€GØ€Kð )-ñ		Bàð	Bð ð	Bð   ‘~ð		Bð
 
õ	Bò	ð ð)�fò )ó ð)ð ð3 ò 3ó ð3ð ðJ˜Vò Jó ðJð €U‡]�]ƒ_Ø", %§*¡*£,ò ó ðõ Oð ð�fò ó ðð ð�fò ó ðð ð

˜&ò 

ó ô

r   )r   )r0   Útypingr   r   Ú	torch.jitr   Útorch.distributionsr   Ú torch.distributions.distributionr   Útorch.distributions.utilsr   r   Ú__all__r   Ú_I0_COEF_SMALLÚ_I0_COEF_LARGEÚ_I1_COEF_SMALLÚ_I1_COEF_LARGEr   r   r"   ÚjitÚscript_if_tracingrA   r	   © r   r   ú<module>r�      sŽ   ðã Ý ã Û Ý Ý +Ý 9ß Bð ˆ,€òò€ò
€ò€ò
€ð ˜~Ð.€Ø˜~Ð.€óð. ‡�×Ññ9ó ð9ôn
ˆ|õ n
r   