a
    h                     @   s~   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	 d dl
mZmZ d dlmZmZ dgZG d	d de	ZdS )
    N)OptionalUnion)Tensor)constraints)ExponentialFamily)_standard_normalbroadcast_all)_Number_sizeNormalc                       s  e Zd ZdZejejdZejZdZ	dZ
eedddZeeddd	Zeedd
dZeedddZd%eeef eeef ee dd fddZd& fdd	Ze fddZe feedddZdd Zdd Zdd Zdd  Zee eef d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-deterministic")
        >>> 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   )returnc                 C   s   | j S Nr   self r   H/var/www/auris/lib/python3.9/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   variance3   s    zNormal.varianceN)r   r   validate_argsr   c                    sN   t ||\| _| _t|tr0t|tr0t }n
| j }t j	||d d S )Nr   )
r   r   r   
isinstancer	   torchSizesizesuper__init__)r   r   r   r   batch_shape	__class__r   r   r#   7   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'   D   s    
zNormal.expandc                 C   sR   |  |}t , t| j|| j|W  d    S 1 sD0    Y  d S r   )_extended_shaper   Zno_gradnormalr   r'   r   )r   sample_shapeshaper   r   r   sampleM   s    

zNormal.sample)r,   r   c                 C   s0   |  |}t|| jj| jjd}| j|| j  S )N)dtypedevice)r*   r   r   r/   r0   r   )r   r,   r-   Zepsr   r   r   rsampleR   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_probW   s    


zNormal.log_probc                 C   s<   | j r| | ddt|| j | j  td   S )N      ?   r   )	r(   r2   r   erfr   r   
reciprocalr3   r5   r   r7   r   r   r   cdfg   s
    
&z
Normal.cdfc                 C   s(   | j | jtd| d  td  S )Nr   r;   )r   r   r   Zerfinvr3   r5   r>   r   r   r   icdfn   s    zNormal.icdfc                 C   s$   ddt dt j   t| j S )Nr:   r   )r3   r4   r6   r   r   r   r   r   r   entropyq   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_paramst   s    zNormal._natural_paramsc                 C   s(   d| d | dttj |   S )Ng      пr   r:   )r   r   r4   r3   r6   )r   xyr   r   r   _log_normalizerx   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   floatr   boolr#   r'   r   r    r.   r
   r1   r9   r?   r@   rA   tuplerB   rE   __classcell__r   r   r%   r   r      s<    

	)r3   typingr   r   r   r   Ztorch.distributionsr   Ztorch.distributions.exp_familyr   Ztorch.distributions.utilsr   r   Ztorch.typesr	   r
   __all__r   r   r   r   r   <module>   s   