
    rh=                         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y)    )OptionalN)Tensor)Function)once_differentiable)constraints)ExponentialFamily)_size	Dirichletc                     |j                  dd      j                  |      }t        j                  | ||      }||| |z  j                  dd      z
  z  S NT)sum	expand_astorch_dirichlet_grad)xconcentrationgrad_outputtotalgrads        p/var/www/html/ai-insurance-compliance-backend/venv/lib/python3.12/site-packages/torch/distributions/dirichlet.py_Dirichlet_backwardr      sT    b$'11-@E  M59D;!k/!6!6r4!@@AA    c                   6    e Zd Zed        Zeed               Zy)
_Dirichletc                 T    t        j                  |      }| j                  ||       |S N)r   _sample_dirichletsave_for_backward)ctxr   r   s      r   forwardz_Dirichlet.forward   s'    ##M2a/r   c                 :    | j                   \  }}t        |||      S r   )saved_tensorsr   )r    r   r   r   s       r   backwardz_Dirichlet.backward   s#     ,,="1m[AAr   N)__name__
__module____qualname__staticmethodr!   r   r$    r   r   r   r      s2     
 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                     |j                         dk  rt        d      || _        |j                  d d |j                  dd  }}t        |   |||       y )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__;   si    
 "M  +#0#6#6s#;]=P=PQSQT=U[kOr   c                    | j                  t        |      }t        j                  |      }| 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>jj- ..55kDDTDT6TUi&)) 	' 	
 "00
r   sample_shapec                     | j                  |      }| j                  j                  |      }t        j	                  |      S r   )_extended_shaper   r<   r   apply)r5   r@   r2   r   s       r   rsamplezDirichlet.rsampleR   s9    $$\2**11%8..r   c                 \   | j                   r| j                  |       t        j                  | j                  dz
  |      j                  d      t        j                  | j                  j                  d            z   t        j                  | j                        j                  d      z
  S )N      ?r   )r=   _validate_sampler   xlogyr   r   lgamma)r5   values     r   log_probzDirichlet.log_probW   s    !!%(KK**S0%8<<R@ll4--11"567ll4--.22267	
r   c                 T    | j                   | j                   j                  dd      z  S r   )r   r   r5   s    r   meanzDirichlet.mean`   s&    !!D$6$6$:$:2t$DDDr   c                 d   | j                   dz
  j                  d      }||j                  dd      z  }| j                   dk  j                  d      }t        j
                  j                  j                  ||   j                  d      |j                  d         j                  |      ||<   |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!4!4R!>>""Q&+++3XX((00J"%'<'<R'@

"T( 	T
 r   c                     | j                   j                  dd      }| j                   || j                   z
  z  |j                  d      |dz   z  z  S )Nr   T   r+   )r   r   pow)r5   con0s     r   variancezDirichlet.variancen   sT    !!%%b$/d(((*xx{dQh')	
r   c                    | j                   j                  d      }| j                   j                  d      }t        j                  | j                         j                  d      t        j                  |      z
  ||z
  t        j
                  |      z  z
  | j                   dz
  t        j
                  | j                         z  j                  d      z
  S )Nr   rF   )r   sizer   r   rI   digamma)r5   ka0s      r   entropyzDirichlet.entropyw   s    ##B'##B'LL++,004ll22vr**+ ""S(EMM$:L:L,MMRRSUVW	
r   c                     | j                   fS r   )r   rM   s    r   _natural_paramszDirichlet._natural_params   s    ""$$r   c                     |j                         j                  d      t        j                   |j                  d            z
  S )Nr   )rI   r   r   )r5   r   s     r   _log_normalizerzDirichlet._log_normalizer   s-    xxz~~b!ELL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01E1EqIO !!GK
 )-PP  ~P 
	P/E /6 /

 Ef E E f   
& 
 

 %v % %<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|      sI       # 7 + <  -BB Ba<! a<r   