U
    ©Ê¹jJ  ã                   @   sj   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gZ	dd„ Z
G d	d
„ d
eƒZG dd„ deƒZdS )é    N)ÚFunction)Úonce_differentiable)Úconstraints)ÚExponentialFamilyÚ	Dirichletc                 C   s8   |  dd¡ |¡}t | ||¡}||| |   dd¡  S ©NéÿÿÿÿT)ÚsumZ	expand_asÚtorchZ_dirichlet_grad)ÚxÚconcentrationÚgrad_outputÚtotalZgrad© r   ú\/var/www/html/bwave/python/venv/lib/python3.8/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_dirichletZsave_for_backward)Úctxr   r   r   r   r   Úforward   s    
z_Dirichlet.forwardc                 C   s   | j \}}t|||ƒS r   )Z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 )r   aÎ  
    Creates a Dirichlet distribution parameterized by concentration :attr:`concentration`.

    Example::

        >>> # xdoctest: +IGNORE_WANT("non-deterinistic")
        >>> m = Dirichlet(torch.tensor([0.5, 0.5]))
        >>> m.sample()  # Dirichlet distributed with concentration [0.5, 0.5]
        tensor([ 0.1046,  0.8954])

    Args:
        concentration (Tensor): concentration parameter of the distribution
            (often referred to as alpha)
    r   é   TNc                    sN   |  ¡ dk rtdƒ‚|| _|jd d… |jdd …  }}tƒ j|||d� d S )Nr   z;`concentration` parameter must be at least one-dimensional.r   ©Úvalidate_args)ÚdimÚ
ValueErrorr   ÚshapeÚsuperÚ__init__)Úselfr   r   Úbatch_shapeÚevent_shape©Ú	__class__r   r   r"   4   s    ÿzDirichlet.__init__c                    sN   |   t|¡}t |¡}| j || j ¡|_tt|ƒj|| jdd� | j	|_	|S )NFr   )
Z_get_checked_instancer   r
   ÚSizer   Úexpandr%   r!   r"   Ú_validate_args)r#   r$   Z	_instanceÚnewr&   r   r   r)   =   s    

  ÿzDirichlet.expandr   c                 C   s    |   |¡}| j |¡}t |¡S r   )Z_extended_shaper   r)   r   Úapply)r#   Zsample_shaper    r   r   r   r   ÚrsampleG   s    
zDirichlet.rsamplec                 C   sL   | j r|  |¡ t | jd |¡ d¡t | j d¡¡ t | j¡ d¡ S )Nç      ð?r   )r*   Z_validate_sampler
   Zxlogyr   r	   Úlgamma)r#   Úvaluer   r   r   Úlog_probL   s    
ÿþÿzDirichlet.log_probc                 C   s   | j | j  dd¡ S r   )r   r	   ©r#   r   r   r   ÚmeanU   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)Zaxis)r   Úclampr	   Úallr
   ÚnnZ
functionalZone_hotZargmaxr    Úto)r#   Zconcentrationm1ÚmodeÚmaskr   r   r   r9   Y   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   Úvariancec   s    ÿþÿzDirichlet.variancec                 C   sb   | j  d¡}| j  d¡}t | j ¡ d¡t |¡ || t |¡  | j d t | j ¡  d¡ S )Nr   r.   )r   Úsizer	   r
   r/   Zdigamma)r#   ÚkZa0r   r   r   Úentropyl   s    ÿþýÿzDirichlet.entropyc                 C   s   | j fS r   )r   r2   r   r   r   Ú_natural_paramsv   s    zDirichlet._natural_paramsc                 C   s   |  ¡  d¡t  | d¡¡ S )Nr   )r/   r	   r
   )r#   r   r   r   r   Ú_log_normalizerz   s    zDirichlet._log_normalizer)N)N)r   )r   r   r   Ú__doc__r   ZindependentZpositiveZarg_constraintsZsimplexZsupportZhas_rsampler"   r)   r-   r1   Úpropertyr3   r9   r=   r@   rA   rB   Ú__classcell__r   r   r&   r   r      s(    ÿ	

	

	


)r
   Ztorch.autogradr   Ztorch.autograd.functionr   Ztorch.distributionsr   Ztorch.distributions.exp_familyr   Ú__all__r   r   r   r   r   r   r   Ú<module>   s   