
    9i=                         S SK Jr  S SKrS SKJr  S SKJr  S SKJr  S SKJ	r	  S SK
Jr  S SKJr  S	/rS
 r " S S\5      r " S S	\5      rg)    )OptionalN)Tensor)Function)once_differentiable)constraints)ExponentialFamily)_size	Dirichletc                     UR                  SS5      R                  U5      n[        R                  " XU5      nXBX-  R                  SS5      -
  -  $ NT)sum	expand_astorch_dirichlet_grad)xconcentrationgrad_outputtotalgrads        ]/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/torch/distributions/dirichlet.py_Dirichlet_backwardr      sN    b$'11-@E  59D!/!6!6r4!@@AA    c                   >    \ rS rSr\S 5       r\\S 5       5       rSrg)
_Dirichlet   c                 T    [         R                  " U5      nU R                  X!5        U$ N)r   _sample_dirichletsave_for_backward)ctxr   r   s      r   forward_Dirichlet.forward   s%    ##M2a/r   c                 6    U R                   u  p#[        X#U5      $ r   )saved_tensorsr   )r!   r   r   r   s       r   backward_Dirichlet.backward   s     ,,"1[AAr    N)	__name__
__module____qualname____firstlineno__staticmethodr"   r   r&   __static_attributes__r(   r   r   r   r      s2     
 B  Br   r   c                   @  ^  \ rS rSrSrS\R                  " \R                  S5      0r\R                  r
Sr SS\S\\   SS4U 4S	 jjjrSU 4S
 jjrSS\S\4S jjrS r\S\4S j5       r\S\4S j5       r\S\4S j5       rS r\S\\   4S j5       rS rSrU =r$ )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                    > UR                  5       S:  a  [        S5      eXl        UR                  S S UR                  SS  pC[        TU ]  X4US9  g )Nr1   z;`concentration` parameter must be at least one-dimensional.r   r2   )dim
ValueErrorr   shapesuper__init__)selfr   r2   batch_shapeevent_shape	__class__s        r   r:   Dirichlet.__init__;   sc    
 "M  +#0#6#6s#;]=P=PQSQT=U[Or   c                   > U R                  [        U5      n[        R                  " U5      nU R                  R                  XR                  -   5      Ul        [        [        U]#  XR                  SS9  U R                  Ul	        U$ )NFr5   )
_get_checked_instancer
   r   Sizer   expandr=   r9   r:   _validate_args)r;   r<   	_instancenewr>   s       r   rC   Dirichlet.expandH   sy    ((I>jj- ..55kDTDT6TUi&)) 	' 	
 "00
r   sample_shapec                     U R                  U5      nU R                  R                  U5      n[        R	                  U5      $ r   )_extended_shaper   rC   r   apply)r;   rH   r8   r   s       r   rsampleDirichlet.rsampleR   s9    $$\2**11%8..r   c                 l   U R                   (       a  U R                  U5        [        R                  " U R                  S-
  U5      R                  S5      [        R                  " U R                  R                  S5      5      -   [        R                  " U R                  5      R                  S5      -
  $ )N      ?r   )rD   _validate_sampler   xlogyr   r   lgamma)r;   values     r   log_probDirichlet.log_probW   s    !!%(KK**S0%8<<R@ll4--11"567ll4--.22267	
r   c                 T    U R                   U R                   R                  SS5      -  $ r   )r   r   r;   s    r   meanDirichlet.mean`   s&    !!D$6$6$:$:2t$DDDr   c                 L   U R                   S-
  R                  SS9nXR                  SS5      -  nU R                   S:  R                  SS9n[        R
                  R                  R                  X#   R                  SS9UR                  S   5      R                  U5      X#'   U$ )Nr1   g        )minr   T)r6   )r   clampr   allr   nn
functionalone_hotargmaxr8   to)r;   concentrationm1modemasks       r   rd   Dirichlet.moded   s    --188S8A!4!4R!>>""Q&+++3XX((00J"%'<'<R'@

"T( 	
 r   c                     U R                   R                  SS5      nU R                   XR                   -
  -  UR                  S5      US-   -  -  $ )Nr   T   r1   )r   r   pow)r;   con0s     r   varianceDirichlet.variancen   sR    !!%%b$/(((*xx{dQh')	
r   c                    U R                   R                  S5      nU R                   R                  S5      n[        R                  " U R                   5      R                  S5      [        R                  " U5      -
  X-
  [        R
                  " U5      -  -
  U R                   S-
  [        R
                  " U R                   5      -  R                  S5      -
  $ )Nr   rO   )r   sizer   r   rR   digamma)r;   ka0s      r   entropyDirichlet.entropyw   s    ##B'##B'LL++,004ll2vr**+ ""S(EMM$:L:L,MMRRSUVW	
r   c                     U R                   4$ r   r   rW   s    r   _natural_paramsDirichlet._natural_params   s    ""$$r   c                     UR                  5       R                  S5      [        R                   " UR                  S5      5      -
  $ )Nr   )rR   r   r   )r;   r   s     r   _log_normalizerDirichlet._log_normalizer   s-    xxz~~b!ELLr$;;;r   ru   r   )r(   )r)   r*   r+   r,   __doc__r   independentpositivearg_constraintssimplexsupporthas_rsampler   r   boolr:   rC   r	   rL   rT   propertyrX   rd   rk   rr   tuplerv   ry   r.   __classcell__)r>   s   @r   r
   r
   %   s     	001E1EqIO !!GK
 )-P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   