o
    Zh                     @   sr   d dl Z d dl mZm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mZ dgZG d	d deZdS )
    N)nanTensor)constraints)Distribution)Gamma)broadcast_all)_Number_size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	efd
dZed	efddZed	efddZedfded	e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r,t|tr,t	 }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__ Q/var/www/auris/lib/python3.10/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.expandreturnc                 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   mean8   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   varianceD   s   zFisherSnedecor.variancer   sample_shapec                 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   r,   shapeZX1ZX2r0   Yr   r   r   r.   O   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_prob[   s   


zFisherSnedecor.log_prob)N)__name__
__module____qualname____doc__r   ZpositiveZarg_constraintsZsupportZhas_rsampler   r   propertyr   r'   r(   r+   r   r   r	   r.   r;   __classcell__r   r   r   r   r
      s    
)r   r   r   Ztorch.distributionsr   Z torch.distributions.distributionr   Ztorch.distributions.gammar   Ztorch.distributions.utilsr   Ztorch.typesr   r	   __all__r
   r   r   r   r   <module>   s   