U
    yāh  ć                   @   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-deterministic")
        >>> 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                    sv   t ||\| _| _t| jd | j| _t| jd | j| _t|trXt|trXt 	” }n
| j 
” }t j||d d S )Nē      ą?©Śvalidate_args)r   r	   r
   r   Ś_gamma1Ś_gamma2Ś
isinstancer   ŚtorchŚSizeŚsizeŚsuperŚ__init__)Śselfr	   r
   r   Śbatch_shape©Ś	__class__© śT/var/www/html/venv/lib/python3.8/site-packages/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   Śmean7   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   ŚvarianceC   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*   N   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Śt2Zt3r   r   r   Ślog_probZ   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*   r6   Ś__classcell__r   r   r   r   r      s   



)Śnumbersr   r   r   Ztorch.distributionsr   Z torch.distributions.distributionr   Ztorch.distributions.gammar   Ztorch.distributions.utilsr   Ś__all__r   r   r   r   r   Ś<module>   s   