U
    ©Ê¹jÜ  ã                   @   sb   d dl Z d dlmZm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G dd„ deƒZdS )é    N)ÚNumberÚReal)Úconstraints)ÚExponentialFamily)Ú_standard_normalÚbroadcast_allÚNormalc                       sÐ   e Zd ZdZejejdœZejZdZ	dZ
edd„ ƒZedd„ ƒZed	d
„ ƒZedd„ ƒZd"‡ fdd„	Zd#‡ fdd„	Ze ¡ fdd„Ze ¡ fdd„Zdd„ Zdd„ Zdd„ Zdd„ Zedd„ ƒZd d!„ Z‡  ZS )$r   a*  
    Creates a normal (also called Gaussian) distribution parameterized by
    :attr:`loc` and :attr:`scale`.

    Example::

        >>> # xdoctest: +IGNORE_WANT("non-deterinistic")
        >>> m = Normal(torch.tensor([0.0]), torch.tensor([1.0]))
        >>> m.sample()  # normally distributed with loc=0 and scale=1
        tensor([ 0.1046])

    Args:
        loc (float or Tensor): mean of the distribution (often referred to as mu)
        scale (float or Tensor): standard deviation of the distribution
            (often referred to as sigma)
    )ÚlocÚscaleTr   c                 C   s   | j S ©N©r	   ©Úself© r   úY/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/distributions/normal.pyÚmean"   s    zNormal.meanc                 C   s   | j S r   r   r   r   r   r   Úmode&   s    zNormal.modec                 C   s   | j S r   )r
   r   r   r   r   Ústddev*   s    zNormal.stddevc                 C   s   | j  d¡S ©Né   )r   Úpowr   r   r   r   Úvariance.   s    zNormal.varianceNc                    sN   t ||ƒ\| _| _t|tƒr0t|tƒr0t ¡ }n
| j ¡ }tƒ j	||d� d S )N©Úvalidate_args)
r   r	   r
   Ú
isinstancer   ÚtorchÚSizeÚsizeÚsuperÚ__init__)r   r	   r
   r   Úbatch_shape©Ú	__class__r   r   r   2   s
    

zNormal.__init__c                    sR   |   t|¡}t |¡}| j |¡|_| j |¡|_tt|ƒj|dd� | j	|_	|S )NFr   )
Z_get_checked_instancer   r   r   r	   Úexpandr
   r   r   Ú_validate_args)r   r    Z	_instanceÚnewr!   r   r   r#   :   s    
zNormal.expandc              
   C   sF   |   |¡}t ¡ �* t | j |¡| j |¡¡W  5 Q R £ S Q R X d S r   )Ú_extended_shaper   Zno_gradÚnormalr	   r#   r
   )r   Úsample_shapeÚshaper   r   r   ÚsampleC   s    

zNormal.samplec                 C   s0   |   |¡}t|| jj| jjd�}| j|| j  S )N)ÚdtypeÚdevice)r&   r   r	   r+   r,   r
   )r   r(   r)   Úepsr   r   r   ÚrsampleH   s    
zNormal.rsamplec                 C   sn   | j r|  |¡ | jd }t| jtƒr2t | j¡n| j ¡ }|| j d  d|  | t t dtj	 ¡¡ S r   )
r$   Ú_validate_sampler
   r   r   ÚmathÚlogr	   ÚsqrtÚpi)r   ÚvalueÚvarZ	log_scaler   r   r   Úlog_probM   s    

 ÿÿþÿzNormal.log_probc                 C   s<   | j r|  |¡ ddt || j | j ¡  t d¡ ¡  S )Nç      à?é   r   )	r$   r/   r   Úerfr	   r
   Ú
reciprocalr0   r2   ©r   r4   r   r   r   Úcdf[   s
    
&ÿz
Normal.cdfc                 C   s(   | j | jt d| d ¡ t d¡  S )Nr   r8   )r	   r
   r   Zerfinvr0   r2   r;   r   r   r   Úicdfb   s    zNormal.icdfc                 C   s$   ddt  dt j ¡  t | j¡ S )Nr7   r   )r0   r1   r3   r   r
   r   r   r   r   Úentropye   s    zNormal.entropyc                 C   s&   | j | j d¡ d| j d¡ ¡  fS )Nr   g      à¿)r	   r
   r   r:   r   r   r   r   Ú_natural_paramsh   s    zNormal._natural_paramsc                 C   s(   d|  d¡ | dt tj | ¡  S )Ng      Ð¿r   r7   )r   r   r1   r0   r3   )r   ÚxÚyr   r   r   Ú_log_normalizerl   s    zNormal._log_normalizer)N)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚrealZpositiveZarg_constraintsZsupportZhas_rsampleZ_mean_carrier_measureÚpropertyr   r   r   r   r   r#   r   r   r*   r.   r6   r<   r=   r>   r?   rB   Ú__classcell__r   r   r!   r   r      s0   



	
)r0   Únumbersr   r   r   Ztorch.distributionsr   Ztorch.distributions.exp_familyr   Ztorch.distributions.utilsr   r   Ú__all__r   r   r   r   r   Ú<module>   s   