a
    MSic]                     @   sd   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 Z	G dd	 d	eZ
G d
d deZdS )    N)Function)once_differentiable)constraints)ExponentialFamilyc                 C   s8   | dd|}t| ||}||| |  dd  S NT)sum	expand_astorchZ_dirichlet_grad)xconcentrationgrad_outputtotalgrad r   Y/var/www/html/django/DPS/env/lib/python3.9/site-packages/torch/distributions/dirichlet.py_Dirichlet_backward	   s    r   c                   @   s(   e Zd Zedd Zeedd ZdS )
_Dirichletc                 C   s   t |}| || |S N)r
   Z_sample_dirichletsave_for_backward)ctxr   r   r   r   r   forward   s    
z_Dirichlet.forwardc                 C   s   | j \}}t|||S r   )saved_tensorsr   )r   r   r   r   r   r   r   backward   s    
z_Dirichlet.backwardN)__name__
__module____qualname__staticmethodr   r   r   r   r   r   r   r      s
   
r   c                       s   e Zd ZdZdeejdiZejZ	dZ
d fdd	Zd fdd		ZdddZdd Zedd Zedd Zedd Zdd Zedd Zdd Z  ZS )	Dirichleta  
    Creates a Dirichlet distribution parameterized by concentration :attr:`concentration`.

    Example::

        >>> m = Dirichlet(torch.tensor([0.5, 0.5]))
        >>> m.sample()  # Dirichlet distributed with concentrarion concentration
        tensor([ 0.1046,  0.8954])

    Args:
        concentration (Tensor): concentration parameter of the distribution
            (often referred to as alpha)
    r      TNc                    sR   |  dk rtd|| _|jd d |jdd   }}tt| j|||d d S )Nr   z;`concentration` parameter must be at least one-dimensional.r   validate_args)dim
ValueErrorr   shapesuperr   __init__)selfr   r!   batch_shapeevent_shape	__class__r   r   r&   /   s
    zDirichlet.__init__c                    sN   |  t|}t|}| j|| j |_tt|j|| jdd | j	|_	|S )NFr    )
_get_checked_instancer   r
   Sizer   expandr)   r%   r&   _validate_args)r'   r(   	_instancenewr*   r   r   r.   6   s    
zDirichlet.expandr   c                 C   s    |  |}| j|}t|S r   )_extended_shaper   r.   r   apply)r'   sample_shaper$   r   r   r   r   rsample>   s    
zDirichlet.rsamplec                 C   sN   | j r| | t|| jd  dt| jd t| jd S )N      ?r   )r/   _validate_sampler
   logr   r   lgamma)r'   valuer   r   r   log_probC   s    
zDirichlet.log_probc                 C   s   | j | j dd S r   )r   r   r'   r   r   r   meanJ   s    zDirichlet.meanc                 C   sd   | j d jdd}||dd }| j dk jdd}tjj|| jdd|j	d 
|||< |S )Nr   g        )minr   T)axis)r   clampr   allr
   nn
functionalone_hotargmaxr$   to)r'   Zconcentrationm1modemaskr   r   r   rG   N   s
    ,zDirichlet.modec                 C   s0   | j dd}| j || j   |d|d   S )Nr   T   r   )r   r   pow)r'   Zcon0r   r   r   varianceV   s    zDirichlet.variancec                 C   sb   | j d}| j d}t| j dt| || t|  | j d t| j  d S )Nr   r6   )r   sizer   r
   r9   digamma)r'   ka0r   r   r   entropy[   s    zDirichlet.entropyc                 C   s   | j fS r   )r   r<   r   r   r   _natural_paramsb   s    zDirichlet._natural_paramsc                 C   s   |  dt |d S )Nr   )r9   r   r
   )r'   r   r   r   r   _log_normalizerf   s    zDirichlet._log_normalizer)N)N)r   )r   r   r   __doc__r   independentpositivearg_constraintssimplexsupporthas_rsampler&   r.   r5   r;   propertyr=   rG   rK   rP   rQ   rR   __classcell__r   r   r*   r   r      s$   




r   )r
   torch.autogradr   Ztorch.autograd.functionr   torch.distributionsr   torch.distributions.exp_familyr   r   r   r   r   r   r   r   <module>   s   