§
    Ÿ²ÅjÊ  ã                   óx   — d dl mZ d dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
mZ d dlmZ dgZ G d„ de¦  «        ZdS )	é    )ÚNumberN)Úconstraints)ÚDistribution)Úbroadcast_allÚlazy_propertyÚlogits_to_probsÚprobs_to_logits)Ú binary_cross_entropy_with_logitsÚ	Geometricc                   óú   ‡ — e Zd ZdZej        ej        dœZej        Z	dˆ fd„	Z
dˆ fd„	Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed	„ ¦   «         Zed
„ ¦   «         Z ej        ¦   «         fd„Zd„ Zd„ Zˆ xZS )r   a€  
    Creates a Geometric distribution parameterized by :attr:`probs`,
    where :attr:`probs` is the probability of success of Bernoulli trials.

    .. math::

        P(X=k) = (1-p)^{k} p, k = 0, 1, ...

    .. note::
        :func:`torch.distributions.geometric.Geometric` :math:`(k+1)`-th trial is the first success
        hence draws samples in :math:`\{0, 1, \ldots\}`, whereas
        :func:`torch.Tensor.geometric_` `k`-th trial is the first success hence draws samples in :math:`\{1, 2, \ldots\}`.

    Example::

        >>> # xdoctest: +IGNORE_WANT("non-deterministic")
        >>> m = Geometric(torch.tensor([0.3]))
        >>> m.sample()  # underlying Bernoulli has 30% chance 1; 70% chance 0
        tensor([ 2.])

    Args:
        probs (Number, Tensor): the probability of sampling `1`. Must be in range (0, 1]
        logits (Number, Tensor): the log-odds of sampling `1`.
    )ÚprobsÚlogitsNc           
      ót  •— |d u |d u k    rt          d¦  «        ‚|�t          |¦  «        \  | _        nt          |¦  «        \  | _        |�|n|}t	          |t
          ¦  «        rt          j        ¦   «         }n|                     ¦   «         }t          ¦   «          
                    ||¬¦  «         | j        r}|�}| j        }|dk    }|                     ¦   «         s^|j        |          }t          dt          |¦  «        j        › dt!          |j        ¦  «        › dt%          | ¦  «        › d|› �¦  «        ‚d S d S d S )Nz;Either `probs` or `logits` must be specified, but not both.©Úvalidate_argsr   zExpected parameter probs (z
 of shape z) of distribution z* to be positive but found invalid values:
)Ú
ValueErrorr   r   r   Ú
isinstancer   ÚtorchÚSizeÚsizeÚsuperÚ__init__Ú_validate_argsÚallÚdataÚtypeÚ__name__ÚtupleÚshapeÚrepr)
Úselfr   r   r   Úprobs_or_logitsÚbatch_shapeÚvalueÚvalidÚinvalid_valueÚ	__class__s
            €úNC:\Projects\Historical\venv\Lib\site-packages\torch/distributions/geometric.pyr   zGeometric.__init__/   s{  ø€ Ø�TˆM˜v¨˜~Ò.Ð.ÝØMñô ð ð ÐÝ)¨%Ñ0Ô0‰MˆTŒZˆZå*¨6Ñ2Ô2‰NˆTŒ[Ø#(Ð#4˜%˜%¸&ˆÝ�o¥vÑ.Ô.ð 	1Ýœ*™,œ,ˆKˆKà)×.Ò.Ñ0Ô0ˆKÝ‰Œ×Ò˜°MÐÑBÔBÐBØÔð 	 5Ð#4à”JˆEØ˜A’IˆEØ—9’9‘;”;ð Ø %¤
¨E¨6Ô 2�Ý ðQÝ˜U™œÔ,ðQð QÝ8=¸e¼kÑ8JÔ8JðQð Qå'+¨D¡z¤zðQð Qð BOðQð Qñô ð ð	ð 	Ð#4Ð#4ðð ó    c                 ór  •— |                       t          |¦  «        }t          j        |¦  «        }d| j        v r| j                             |¦  «        |_        d| j        v r| j                             |¦  «        |_        t          t          |¦  «         	                    |d¬¦  «         | j
        |_
        |S )Nr   r   Fr   )Ú_get_checked_instancer   r   r   Ú__dict__r   Úexpandr   r   r   r   )r!   r#   Ú	_instanceÚnewr'   s       €r(   r-   zGeometric.expandK   s¢   ø€ Ø×(Ò(­°IÑ>Ô>ˆÝ”j Ñ-Ô-ˆØ�d”mÐ#Ð#Øœ
×)Ò)¨+Ñ6Ô6ˆCŒIØ�t”}Ð$Ð$Øœ×+Ò+¨KÑ8Ô8ˆCŒJÝ�i˜ÑÔ×&Ò& {À%Ð&ÑHÔHÐHØ!Ô0ˆÔØˆ
r)   c                 ó   — d| j         z  dz
  S ©Ng      ð?©r   ©r!   s    r(   ÚmeanzGeometric.meanV   s   € à�T”ZÑ #Ñ%Ð%r)   c                 ó4   — t          j        | j        ¦  «        S ©N)r   Ú
zeros_liker   r3   s    r(   ÚmodezGeometric.modeZ   s   € åÔ ¤
Ñ+Ô+Ð+r)   c                 ó,   — d| j         z  dz
  | j         z  S r1   r2   r3   s    r(   ÚvariancezGeometric.variance^   s   € à�d”jÑ  3Ñ&¨$¬*Ñ4Ð4r)   c                 ó.   — t          | j        d¬¦  «        S ©NT)Ú	is_binary)r	   r   r3   s    r(   r   zGeometric.logitsb   s   € å˜tœz°TÐ:Ñ:Ô:Ð:r)   c                 ó.   — t          | j        d¬¦  «        S r<   )r   r   r3   s    r(   r   zGeometric.probsf   s   € å˜tœ{°dÐ;Ñ;Ô;Ð;r)   c                 ój  — |                       |¦  «        }t          j        | j        j        ¦  «        j        }t          j        ¦   «         5  t          j                             ¦   «         rBt          j	        || j        j        | j        j
        ¬¦  «        }|                     |¬¦  «        }n.| j                             |¦  «                             |d¦  «        }|                     ¦   «         | j                              ¦   «         z                       ¦   «         cd d d ¦  «         S # 1 swxY w Y   d S )N)ÚdtypeÚdevice)Úminé   )Ú_extended_shaper   Úfinfor   r@   ÚtinyÚno_gradÚ_CÚ_get_tracing_stateÚrandrA   Úclampr/   Úuniform_ÚlogÚlog1pÚfloor)r!   Úsample_shaper   rF   Úus        r(   ÚsamplezGeometric.samplej   s6  € Ø×$Ò$ \Ñ2Ô2ˆÝŒ{˜4œ:Ô+Ñ,Ô,Ô1ˆÝŒ]‰_Œ_ð 	=ð 	=ÝŒx×*Ò*Ñ,Ô,ð <å”J˜u¨D¬JÔ,<ÀTÄZÔEVÐWÑWÔW�Ø—G’G �GÑ%Ô%��à”J—N’N 5Ñ)Ô)×2Ò2°4¸Ñ;Ô;�Ø—E’E‘G”G ¤
˜{×1Ò1Ñ3Ô3Ñ3×:Ò:Ñ<Ô<ð	=ð 	=ð 	=ð 	=ñ 	=ô 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=øøøð 	=ð 	=ð 	=ð 	=ð 	=ð 	=s   ÁCD(Ä(D,Ä/D,c                 ó.  — | j         r|                      |¦  «         t          || j        ¦  «        \  }}|                     t
          j        ¬¦  «        }d||dk    |dk    z  <   ||                      ¦   «         z  | j                             ¦   «         z   S )N)Úmemory_formatr   rC   )	r   Ú_validate_sampler   r   Úcloner   Úcontiguous_formatrN   rM   )r!   r$   r   s      r(   Úlog_probzGeometric.log_probv   s‹   € ØÔð 	)Ø×!Ò! %Ñ(Ô(Ð(Ý$ U¨D¬JÑ7Ô7‰ˆˆuØ—’­%Ô*A�ÑBÔBˆØ-.ˆˆu˜Šz˜e qšjÑ)Ñ*Ø˜˜—~’~Ñ'Ô'Ñ'¨$¬*¯.ª.Ñ*:Ô*:Ñ:Ð:r)   c                 óJ   — t          | j        | j        d¬¦  «        | j        z  S )NÚnone)Ú	reduction)r
   r   r   r3   s    r(   ÚentropyzGeometric.entropy~   s(   € å,¨T¬[¸$¼*ÐPVÐWÑWÔWØŒjñð	
r)   )NNNr6   )r   Ú
__module__Ú__qualname__Ú__doc__r   Úunit_intervalÚrealÚarg_constraintsÚnonnegative_integerÚsupportr   r-   Úpropertyr4   r8   r:   r   r   r   r   r   rR   rX   r\   Ú__classcell__)r'   s   @r(   r   r      sH  ø€ € € € € ðð ð0 !,Ô 9À[ÔEUÐVÐV€OØÔ-€Gðð ð ð ð ð ð8	ð 	ð 	ð 	ð 	ð 	ð ð&ð &ñ „Xð&ð ð,ð ,ñ „Xð,ð ð5ð 5ñ „Xð5ð ð;ð ;ñ „]ð;ð ð<ð <ñ „]ð<ð #- %¤*¡,¤,ð 
=ð 
=ð 
=ð 
=ð;ð ;ð ;ð
ð 
ð 
ð 
ð 
ð 
ð 
r)   )Únumbersr   r   Útorch.distributionsr   Ú torch.distributions.distributionr   Útorch.distributions.utilsr   r   r   r	   Útorch.nn.functionalr
   Ú__all__r   © r)   r(   ú<module>rn      sÜ   ðà Ð Ð Ð Ð Ð à €€€Ø +Ð +Ð +Ð +Ð +Ð +Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9ðð ð ð ð ð ð ð ð ð ð ð ð AÐ @Ð @Ð @Ð @Ð @ð ˆ-€ðo
ð o
ð o
ð o
ð o
�ñ o
ô o
ð o
ð o
ð o
r)   