U
    d                     @   s`   d dl Z d dlZd dlmZmZ d dlmZmZ d dlm	Z	 d dl
mZmZ G dd de	ZdS )    N)infnan)Chi2constraints)Distribution)_standard_normalbroadcast_allc                       s   e Zd ZdZejejejdZejZ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dd Zdd Z  ZS )StudentTa  
    Creates a Student's t-distribution parameterized by degree of
    freedom :attr:`df`, mean :attr:`loc` and scale :attr:`scale`.

    Example::

        >>> m = StudentT(torch.tensor([2.0]))
        >>> m.sample()  # Student's t-distributed with degrees of freedom=2
        tensor([ 0.1046])

    Args:
        df (float or Tensor): degrees of freedom
        loc (float or Tensor): mean of the distribution
        scale (float or Tensor): scale of the distribution
    )dflocscaleTc                 C   s"   | j jtjd}t|| jdk< |S )NZmemory_format   )r   clonetorchcontiguous_formatr   r
   selfm r   @/tmp/pip-unpacked-wheel-ua33x9lu/torch/distributions/studentT.pymean   s    zStudentT.meanc                 C   s   | j S )N)r   )r   r   r   r   mode$   s    zStudentT.modec                 C   s~   | j jtjd}| j| j dk d| j | j dk  | j | j dk d  || j dk< t|| j dk| j dk@ < t|| j dk< |S )Nr      r   )r
   r   r   r   r   powr   r   r   r   r   r   variance(   s
    DzStudentT.variance              ?Nc                    sF   t |||\| _| _| _t| j| _| j }tt| j	||d d S )Nvalidate_args)
r   r
   r   r   r   _chi2sizesuperr	   __init__)r   r
   r   r   r   batch_shape	__class__r   r   r#   0   s    
zStudentT.__init__c                    sn   |  t|}t|}| j||_| j||_| j||_| j||_t	t|j
|dd | j|_|S )NFr   )Z_get_checked_instancer	   r   Sizer
   expandr   r   r    r"   r#   _validate_args)r   r$   Z	_instancenewr%   r   r   r(   6   s    
zStudentT.expandc                 C   sP   |  |}t|| jj| jjd}| j|}|t|| j  }| j	| j
|  S )N)dtypedevice)Z_extended_shaper   r
   r+   r,   r    rsampler   Zrsqrtr   r   )r   Zsample_shapeshapeXZYr   r   r   r-   A   s
    
zStudentT.rsamplec                 C   s   | j r| | || j | j }| j d| j   dttj  t	d| j  t	d| jd   }d| jd  t
|d | j  | S )N      ?r   g      g       @)r)   Z_validate_sampler   r   logr
   mathpir   lgammalog1p)r   valueyr0   r   r   r   log_probO   s    
zStudentT.log_probc                 C   s|   t d| j td t d| jd   }| j d| jd  t d| jd  t d| j    d| j   | S )Nr2   r   )r   r6   r
   r4   r   r3   Zdigamma)r   Zlbetar   r   r   entropyZ   s    ."zStudentT.entropy)r   r   N)N)__name__
__module____qualname____doc__r   ZpositiverealZarg_constraintsZsupportZhas_rsamplepropertyr   r   r   r#   r(   r   r'   r-   r:   r;   __classcell__r   r   r%   r   r	   
   s   


r	   )r4   r   Z
torch._sixr   r   Ztorch.distributionsr   r   Z torch.distributions.distributionr   Ztorch.distributions.utilsr   r   r	   r   r   r   r   <module>   s   