U
    JcD                     @   sj   d dl 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
 d dlmZ dgZG d	d deZdS )
    )NumberN)nan)constraints)Distribution)Gamma)broadcast_allFisherSnedecorc                       s   e Zd ZdZejejdZejZdZd fdd	Z	d fdd	Z
ed	d
 Zedd Zedd ZedfddZdd Z  ZS )r   a  
    Creates a Fisher-Snedecor distribution parameterized by :attr:`df1` and :attr:`df2`.

    Example::

        >>> # xdoctest: +IGNORE_WANT("non-deterinistic")
        >>> m = FisherSnedecor(torch.tensor([1.0]), torch.tensor([2.0]))
        >>> m.sample()  # Fisher-Snedecor-distributed with df1=1 and df2=2
        tensor([ 0.2453])

    Args:
        df1 (float or Tensor): degrees of freedom parameter 1
        df2 (float or Tensor): degrees of freedom parameter 2
    )df1df2TNc                    sz   t ||\| _| _t| jd | j| _t| jd | j| _t|trXt|trXt	 }n
| j
 }tt| j||d d S )N      ?validate_args)r   r	   r
   r   _gamma1_gamma2
isinstancer   torchSizesizesuperr   __init__)selfr	   r
   r   batch_shape	__class__ F/tmp/pip-unpacked-wheel-gikjz4vx/torch/distributions/fishersnedecor.pyr      s    

zFisherSnedecor.__init__c                    sn   |  t|}t|}| j||_| j||_| j||_| j||_t	t|j
|dd | j|_|S )NFr   )Z_get_checked_instancer   r   r   r	   expandr
   r   r   r   r   _validate_args)r   r   Z	_instancenewr   r   r   r   )   s    
zFisherSnedecor.expandc                 C   s(   | j jtjd}t||dk< ||d  S )NZmemory_format   )r
   cloner   contiguous_formatr   r   r
   r   r   r   mean4   s    zFisherSnedecor.meanc                 C   s2   | j d | j  | j | jd  }t|| j dk< |S )Nr    )r	   r
   r   )r   moder   r   r   r%   :   s     zFisherSnedecor.modec                 C   sT   | j jtjd}t||dk< d|d | j| d  | j|d d |d   S )Nr      r    )r
   r!   r   r"   r   powr	   r#   r   r   r   variance@   s    zFisherSnedecor.variancer   c                 C   s`   |  |}| j||}| j||}t|jj}|j	|d || }|j	|d |S )N)min)
Z_extended_shaper   rsampleviewr   r   ZfinfoZdtypetinyZclamp_)r   Zsample_shapeshapeZX1ZX2r,   Yr   r   r   r*   F   s    
zFisherSnedecor.rsamplec                 C   s   | j r| | | jd }| jd }| j| j }||  |  |  }||  |d t|  }|| t||  }|| | S )Nr      )r   Z_validate_sampler	   r
   lgammalogr   log1p)r   valueZct1Zct2Zct3t1t2t3r   r   r   log_probR   s    


zFisherSnedecor.log_prob)N)N)__name__
__module____qualname____doc__r   ZpositiveZarg_constraintsZsupportZhas_rsampler   r   propertyr$   r%   r(   r   r   r*   r7   __classcell__r   r   r   r   r      s   


)Znumbersr   r   Z
torch._sixr   Ztorch.distributionsr   Z torch.distributions.distributionr   Ztorch.distributions.gammar   Ztorch.distributions.utilsr   __all__r   r   r   r   r   <module>   s   