
    }Yh=                         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 dlmZ d	gZd
 Z G d de          Z G d d	e          ZdS )    )OptionalN)Tensor)Function)once_differentiable)constraints)ExponentialFamily)_size	Dirichletc                     |                     dd                              |          }t          j        | ||          }||| |z                       dd          z
  z  S NT)sum	expand_astorch_dirichlet_grad)xconcentrationgrad_outputtotalgrads        o/var/www/tools.fuzzalab.pt/emblema-extractor/venv/lib/python3.11/site-packages/torch/distributions/dirichlet.py_Dirichlet_backwardr      s]    b$''11-@@E M599D;!k/!6!6r4!@!@@AA    c                   J    e Zd Zed             Zeed                         ZdS )
_Dirichletc                 Z    t          j        |          }|                     ||           |S N)r   _sample_dirichletsave_for_backward)ctxr   r   s      r   forwardz_Dirichlet.forward   s-    #M22a///r   c                 8    | j         \  }}t          |||          S r   )saved_tensorsr   )r    r   r   r   s       r   backwardz_Dirichlet.backward   s#     ,="1m[AAAr   N)__name__
__module____qualname__staticmethodr!   r   r$    r   r   r   r      sX          \
 B B  \B B Br   r   c                   .    e Zd ZdZd ej        ej        d          iZej        Z	dZ
	 ddedee         ddf fdZd fd		ZddedefdZd Zedefd            Zedefd            Zedefd            Zd Zedee         fd            Zd Z xZS )r
   a  
    Creates a Dirichlet distribution parameterized by concentration :attr:`concentration`.

    Example::

        >>> # xdoctest: +IGNORE_WANT("non-deterministic")
        >>> 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      TNvalidate_argsreturnc                     |                                 dk     rt          d          || _        |j        d d         |j        dd          }}t	                                          |||           d S )Nr+   z;`concentration` parameter must be at least one-dimensional.r   r,   )dim
ValueErrorr   shapesuper__init__)selfr   r,   batch_shapeevent_shape	__class__s        r   r4   zDirichlet.__init__;   s    
 ""M   +#0#6ss#;]=PQSQTQT=U[kOOOOOr   c                 ,   |                      t          |          }t          j        |          }| j                            || j        z             |_        t          t          |                              || j        d           | j	        |_	        |S )NFr/   )
_get_checked_instancer
   r   Sizer   expandr7   r3   r4   _validate_args)r5   r6   	_instancenewr8   s       r   r<   zDirichlet.expandH   s    ((I>>j-- .55kDDT6TUUi&&) 	' 	
 	
 	
 "0
r   r)   sample_shapec                     |                      |          }| j                            |          }t                              |          S r   )_extended_shaper   r<   r   apply)r5   r@   r2   r   s       r   rsamplezDirichlet.rsampleR   s?    $$\22*11%88...r   c                 N   | j         r|                     |           t          j        | j        dz
  |                              d          t          j        | j                            d                    z   t          j        | j                                      d          z
  S )N      ?r   )r=   _validate_sampler   xlogyr   r   lgamma)r5   values     r   log_probzDirichlet.log_probW   s     	)!!%(((K*S0%88<<R@@l4-11"55667l4-..222667	
r   c                 H    | j         | j                             dd          z  S r   )r   r   r5   s    r   meanzDirichlet.mean`   s#    !D$6$:$:2t$D$DDDr   c                 r   | j         dz
                      d          }||                    dd          z  }| j         dk                         d          }t          j        j                            ||                             d          |j	        d                   
                    |          ||<   |S )Nr+   g        )minr   T)r0   )r   clampr   allr   nn
functionalone_hotargmaxr2   to)r5   concentrationm1modemasks       r   rY   zDirichlet.moded   s    -188S8AA!4!4R!>!>>"Q&+++33X(00J"%%'<R'@
 

"T(( 	T
 r   c                     | j                             dd          }| j         || j         z
  z  |                    d          |dz   z  z  S )Nr   T   r+   )r   r   pow)r5   con0s     r   variancezDirichlet.variancen   sP    !%%b$//d((*xx{{dQh')	
r   c                    | j                             d          }| j                             d          }t          j        | j                                       d          t          j        |          z
  ||z
  t          j        |          z  z
  | j         dz
  t          j        | j                   z                      d          z
  S )Nr   rF   )r   sizer   r   rI   digamma)r5   ka0s      r   entropyzDirichlet.entropyw   s    ##B''##B''L+,,0044l22vr***+ "S(EM$:L,M,MMRRSUVVW	
r   c                     | j         fS r   )r   rM   s    r   _natural_paramszDirichlet._natural_params   s    "$$r   c                     |                                                     d          t          j         |                    d                    z
  S )Nr   )rI   r   r   )r5   r   s     r   _log_normalizerzDirichlet._log_normalizer   s5    xxzz~~b!!ELr$;$;;;r   r   )r)   )r%   r&   r'   __doc__r   independentpositivearg_constraintssimplexsupporthas_rsampler   r   boolr4   r<   r	   rD   rK   propertyrN   rY   r_   re   tuplerg   ri   __classcell__)r8   s   @r   r
   r
   %   s          	001EqIIO !GK
 )-P PP  ~P 
	P P P P P P     / /E /6 / / / /

 
 
 Ef E E E XE f    X 
& 
 
 
 X

 
 
 %v % % % X%< < < < < < <r   )typingr   r   r   torch.autogradr   torch.autograd.functionr   torch.distributionsr   torch.distributions.exp_familyr   torch.typesr	   __all__r   r   r
   r)   r   r   <module>r|      s                # # # # # # 7 7 7 7 7 7 + + + + + + < < < < < <       -B B BB B B B B B B Ba< a< a< a< a<! a< a< a< a< a<r   