Ë
    f^(hH  ã                   óâ   — d dl 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)ÚTensor)Úconstraints)ÚDistribution)Úbroadcast_allÚlazy_propertyÚVonMisesc                 ór   — t        |«      }|j                  «       }|r|j                  «       | |z  z   }|rŒ|S ©N)ÚlistÚpop)ÚyÚcoefÚresults      ú[/var/www/skyplay_api_hub/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!   D   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_sampler@   [   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                   óX  ‡ — e Zd ZdZej
                  ej                  dœZej
                  ZdZ	dˆ 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
    )r4   r5   Fc                 ó®   •— t        ||«      \  | _        | _        | j                  j                  }t	        j
                  «       }t        ‰| �  |||«       y r
   )r   r4   r5   r)   r   ÚSizeÚsuperÚ__init__)Úselfr4   r5   Úvalidate_argsÚbatch_shapeÚevent_shapeÚ	__class__s         €r   rE   zVonMises.__init__�   sB   ø€ Ü'4°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_sampler5   r   r.   r4   r/   r   r0   r!   )rF   ÚvalueÚlog_probs      r   rP   zVonMises.log_prob‡   sy   € Ø×ÒØ×!Ñ! %Ô(Ø×%Ñ%¬¯	©	°%¸$¿(¹(Ñ2BÓ(CÑCˆàÜ�h‰h�qœ4Ÿ7™7‘{Ó#ñ$ä% d×&8Ñ&8ÀÔBñCð 	ð
 ˆr   Úreturnc                 óT   — | j                   j                  t        j                  «      S r
   )r4   Útor   Údouble©rF   s    r   Ú_loczVonMises._loc’   s   € à�x‰x�{‰{œ5Ÿ<™<Ó(Ð(r   c                 óT   — | j                   j                  t        j                  «      S r
   )r5   rS   r   rT   rU   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ãˆµøä>)rX   Úsqrtr   r   )rF   Ú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   ÚemptyrV   r$   r4   r%   r@   rX   r_   rS   )rF   Ú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)NrM   )rG   )rD   ÚexpandÚNotImplementedErrorÚ__dict__Úgetr4   r5   Útype)rF   rH   Ú	_instancerG   r4   r5   rJ   s         €r   rg   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.
        ©r4   rU   s    r   ÚmeanzVonMises.mean¾   s   € ð
 �x‰xˆr   c                 ó   — | j                   S r
   rn   rU   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   rL   r   )r!   r5   ÚexprU   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_rsamplerE   rP   r   r   rV   rX   r_   r   Úno_gradrC   re   rg   Úpropertyro   rq   rt   Ú__classcell__)rJ   s   @r   r   r   k   s  ø„ ñð" *×.Ñ.À×AUÑAUÑV€OØ×Ñ€GØ€KõBò	ð ð)�fò )ó ð)ð ð3 ò 3ó ð3ð ðJ˜Vò Jó ðJð €U‡]�]ƒ_Ø", %§*¡*£,ò ó ðõ Oð ð�fò ó ðð ð�fò ó ðð ð

˜&ò 

ó ô

r   )r   )r/   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_tracingr@   r   © r   r   ú<module>r�      s‹   ðã ã Û Ý Ý +Ý 9ß Bð ˆ,€òò€ò
€ò€ò
€ð ˜~Ð.€Ø˜~Ð.€óð. ‡�×Ññ9ó ð9ôi
ˆ|õ i
r   