§
    Ÿ²Åj¬  ã                   óÐ   — 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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dS )é    N)Úconstraints)ÚDistribution)Úbroadcast_allÚlazy_propertyÚVonMisesc                 óˆ   — t          |¦  «        }|                     ¦   «         }|r|                     ¦   «         | |z  z   }|°|S ©N)ÚlistÚpop)ÚyÚcoefÚresults      úNC:\Projects\Historical\venv\Lib\site-packages\torch/distributions/von_mises.pyÚ
_eval_polyr      sG   € Ý�‰:Œ:€DØ�XŠX‰ZŒ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                 óœ  — |dk    s|dk    sJ ‚| dz  }||z  }t          |t          |         ¦  «        }|dk    r|                      ¦   «         |z  }|                     ¦   «         }d| z  }| d|                      ¦   «         z  z
  t          |t          |         ¦  «                             ¦   «         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    C   sÆ   € ð
 �AŠ:ˆ:˜ !š˜˜Ð#ð 	
ˆD‰€AØ	ˆA‰€AÝ�q�+ eÔ,Ñ-Ô-€EØ�‚z€zØ—’‘”˜%‘ˆØ�IŠI‰KŒK€Eð 	ˆq‰€AØ��a—e’e‘g”g‘Ñ¥
¨1­k¸%Ô.@Ñ AÔ A× EÒ EÑ GÔ GÑG€EåŒ[˜˜Tš 5¨%Ñ0Ô0€FØ€Mr   c                 ó  — t          j        |j        t           j        | j        ¬¦  «        }|                     ¦   «         �st          j        d|j        z   | j        | j        ¬¦  «        }|                     ¦   «         \  }}}t          j	        t          j        |z  ¦  «        }	d||	z  z   ||	z   z  }
|||
z
  z  }|d|z
  z  |z
  dk    ||z                       ¦   «         dz   |z
  dk    z  }|                     ¦   «         rEt          j        ||dz
                       ¦   «         |
                     ¦   «         z  |¦  «        }||z  }|                     ¦   «         �¯|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?   Z   sP  € åŒ;�q”w¥e¤j¸¼ÐDÑDÔD€DØ�hŠh‰jŒjñ 	!ÝŒJ�t˜aœg‘~¨S¬Y¸s¼zÐJÑJÔJˆØ—X’X‘Z”Z‰
ˆˆB�ÝŒI•d”g ‘lÑ#Ô#ˆØ�˜a‘Ñ J°¡NÑ3ˆØ˜Z¨!™^Ñ,ˆØ˜˜A™‘; Ñ# qÒ(¨a°"©f¯\ª\©^¬^¸aÑ-?À!Ñ-CÀqÒ-HÑIˆØ�:Š:‰<Œ<ð 	!Ý”˜F R¨#¡X§O¢OÑ$5Ô$5¸¿º¹¼Ñ$@À!ÑDÔDˆAØ˜&‘=ˆDð �hŠh‰jŒjñ 	!ð •”‰K˜#Ñ !¥d¤g¡+Ñ.µ´Ñ8Ð8r   c                   ó8  ‡ — 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„ ¦   «         Zed„ ¦   «         Zed	„ ¦   «         Z ej        ¦   «          ej        ¦   «         fd
„¦   «         Zdˆ fd„	Zed„ ¦   «         Zed„ ¦   «         Ze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
    )r3   r4   FNc                 óÆ   •— t          ||¦  «        \  | _        | _        | j        j        }t	          j        ¦   «         }t          ¦   «                              |||¦  «         d S r	   )r   r3   r4   r(   r   ÚSizeÚsuperÚ__init__)Úselfr3   r4   Úvalidate_argsÚbatch_shapeÚevent_shapeÚ	__class__s         €r   rD   zVonMises.__init__€   sR   ø€ Ý'4°S¸-Ñ'HÔ'HÑ$ˆŒ�$Ô$Ø”h”nˆÝ”j‘l”lˆÝ‰Œ×Ò˜ k°=ÑAÔAÐAÐAÐAr   c                 óü   — | j         r|                      |¦  «         | j        t          j        || j        z
  ¦  «        z  }|t          j        dt          j        z  ¦  «        z
  t          | j        d¬¦  «        z
  }|S )Nr&   r   ©r   )
Ú_validate_argsÚ_validate_sampler4   r   r-   r3   r.   r   r/   r    )rE   ÚvalueÚlog_probs      r   rO   zVonMises.log_prob†   s   € ØÔð 	)Ø×!Ò! %Ñ(Ô(Ð(ØÔ%­¬	°%¸$¼(Ñ2BÑ(CÔ(CÑCˆàÝŒh�q�4œ7‘{Ñ#Ô#ñ$å% dÔ&8ÀÐBÑBÔBñCð 	ð
 ˆr   c                 óJ   — | j                              t          j        ¦  «        S r	   )r3   Útor   Údouble©rE   s    r   Ú_loczVonMises._loc‘   s   € àŒx�{Š{�5œ<Ñ(Ô(Ð(r   c                 óJ   — | j                              t          j        ¦  «        S r	   )r4   rQ   r   rR   rS   s    r   Ú_concentrationzVonMises._concentration•   s   € àÔ!×$Ò$¥U¤\Ñ2Ô2Ð2r   c                 óð   — | j         }ddd|dz  z  z                        ¦   «         z   }|d|z                       ¦   «         z
  d|z  z  }d|dz  z   d|z  z  }d|z  |z   }t          j        |dk     ||¦  «        S )Nr   é   r&   gñhãˆµøä>)rV   Úsqrtr   r   )rE   Ú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ÔIÐIr   c                 óþ   — |                       |¦  «        }t          j        || j        j        | j        j        ¬¦  «        }t          | 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   ÚemptyrT   r#   r3   r$   r?   rV   r]   rQ   )rE   Úsample_shaper(   r   s       r   ÚsamplezVonMises.sample£   si   € ð ×$Ò$ \Ñ2Ô2ˆÝŒK˜ T¤Y¤_¸T¼X¼_ÐMÑMÔMˆÝ ØŒI�tÔ*¨DÔ,<¸añ
ô 
ç
Š"ˆTŒXŒ^Ñ
Ô
ð	r   c                 ó:  •— 	 t          ¦   «                              |¦  «        S # t          $ rl | j                             d¦  «        }| j                             |¦  «        }| j                             |¦  «        } t          | ¦  «        |||¬¦  «        cY S w xY w)NrL   )rF   )rC   ÚexpandÚNotImplementedErrorÚ__dict__Úgetr3   r4   Útype)rE   rG   Ú	_instancerF   r3   r4   rI   s         €r   re   zVonMises.expand´   s    ø€ ð	OÝ‘7”7—>’> +Ñ.Ô.Ð.øÝ"ð 	Oð 	Oð 	OØ œM×-Ò-Ð.>Ñ?Ô?ˆMØ”(—/’/ +Ñ.Ô.ˆCØ Ô.×5Ò5°kÑBÔBˆMØ•4˜‘:”:˜c =ÀÐNÑNÔNÐNÐNÐNð		Oøøøs   ƒ $ ¤A3BÂBc                 ó   — | j         S )z8
        The provided mean is the circular one.
        ©r3   rS   s    r   ÚmeanzVonMises.mean½   s   € ð
 Œxˆr   c                 ó   — | j         S r	   rl   rS   s    r   ÚmodezVonMises.modeÄ   s	   € àŒxˆr   c                 ó†   — dt          | j        d¬¦  «        t          | j        d¬¦  «        z
                       ¦   «         z
  S )z<
        The provided variance is the circular one.
        r   rK   r   )r    r4   ÚexprS   s    r   ÚvariancezVonMises.varianceÈ   sF   € ð å'¨Ô(:À!ÐDÑDÔDÝ)¨$Ô*<ÀAÐFÑFÔFñGçŠc‰eŒeñ	ð	
r   r	   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚrealÚpositiveÚarg_constraintsÚsupportÚhas_rsamplerD   rO   r   rT   rV   r]   r   Úno_gradrB   rc   re   Úpropertyrm   ro   rr   Ú__classcell__)rI   s   @r   r   r   j   sz  ø€ € € € € ðð ð" *Ô.ÀÔAUÐVÐV€OØÔ€GØ€KðBð Bð Bð Bð Bð Bð	ð 	ð 	ð ð)ð )ñ „]ð)ð ð3ð 3ñ „]ð3ð ðJð Jñ „]ðJð €U„]�_„_Ø", %¤*¡,¤,ð ð ð ñ „_ðð Oð Oð Oð Oð Oð Oð ðð ñ „Xðð ðð ñ „Xðð ð

ð 

ñ „]ð

ð 

ð 

ð 

ð 

r   )r   )r.   r   Ú	torch.jitÚ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‹      sD  ðà €€€à €€€Ø Ð Ð Ð Ø +Ð +Ð +Ð +Ð +Ð +Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø BÐ BÐ BÐ BÐ BÐ BÐ BÐ Bð ˆ,€ðð ð ðð ð €ð
ð 
ð 
€ðð ð €ð
ð 
ð 
€ð ˜~Ð.€Ø˜~Ð.€ðð ð ð ð. „Ôð9ð 9ñ Ôð9ði
ð i
ð i
ð i
ð i
ˆ|ñ i
ô i
ð i
ð i
ð i
r   