§
    Ÿ²Åj  ã                   óŽ   — 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gZd„ Z G d	„ d
e¦  «        Z G d„ de¦  «        ZdS )é    N)ÚFunction)Úonce_differentiable)Úconstraints)ÚExponentialFamily)Ú_sizeÚ	Dirichletc                 ó¾   — |                      dd¦  «                             |¦  «        }t          j        | ||¦  «        }||| |z                        dd¦  «        z
  z  S ©NéÿÿÿÿT)ÚsumÚ	expand_asÚtorchÚ_dirichlet_grad)ÚxÚconcentrationÚgrad_outputÚtotalÚgrads        úNC:\Projects\Historical\venv\Lib\site-packages\torch/distributions/dirichlet.pyÚ_Dirichlet_backwardr      s]   € Ø×Ò˜b $Ñ'Ô'×1Ò1°-Ñ@Ô@€EÝÔ   M°5Ñ9Ô9€DØ�; ! k¡/×!6Ò!6°r¸4Ñ!@Ô!@Ñ@Ñ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#   € ð Ô,Ñˆˆ=Ý" 1 m°[Ñ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ˆ fd„	Zdˆ fd„	Zdd	ed
ej        fd„Zd„ Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zd„ Ze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   é   TNc                 óè   •— |                      ¦   «         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   ©Úvalidate_args)ÚdimÚ
ValueErrorr   ÚshapeÚsuperÚ__init__)Úselfr   r,   Úbatch_shapeÚevent_shapeÚ	__class__s        €r   r1   zDirichlet.__init__7   s‚   ø€ Ø×ÒÑÔ Ò"Ð"ÝØMñô ð ð +ˆÔØ#0Ô#6°s¸°sÔ#;¸]Ô=PÐQSÐQTÐQTÔ=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   Úexpandr4   r0   r1   Ú_validate_args)r2   r3   Ú	_instanceÚnewr5   s       €r   r9   zDirichlet.expand@   s‹   ø€ Ø×(Ò(­°IÑ>Ô>ˆÝ”j Ñ-Ô-ˆØ Ô.×5Ò5°kÀDÔDTÑ6TÑUÔUˆÔÝ�i˜ÑÔ×&Ò&Ø˜Ô)¸ð 	'ñ 	
ô 	
ð 	
ð "Ô0ˆÔØˆ
r   r'   Úsample_shapeÚreturnc                 ó”   — |                       |¦  «        }| j                             |¦  «        }t                               |¦  «        S r   )Ú_extended_shaper   r9   r   Úapply)r2   r=   r/   r   s       r   ÚrsamplezDirichlet.rsampleJ   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)r2   Úvalues     r   Úlog_probzDirichlet.log_probO   s‘   € ØÔð 	)Ø×!Ò! %Ñ(Ô(Ð(åŒK˜Ô*¨SÑ0°%Ñ8Ô8×<Ò<¸RÑ@Ô@ÝŒl˜4Ô-×1Ò1°"Ñ5Ô5Ñ6Ô6ñ7åŒl˜4Ô-Ñ.Ô.×2Ò2°2Ñ6Ô6ñ7ð	
r   c                 óH   — | j         | j                              dd¦  «        z  S r
   )r   r   ©r2   s    r   ÚmeanzDirichlet.meanX   s#   € àÔ! DÔ$6×$:Ò$:¸2¸tÑ$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)Úaxis)r   Úclampr   Úallr   ÚnnÚ
functionalÚone_hotÚargmaxr/   Úto)r2   Úconcentrationm1ÚmodeÚmasks       r   rX   zDirichlet.mode\   s­   € àÔ-°Ñ1×8Ò8¸SÐ8ÑAÔAˆØ ×!4Ò!4°R¸Ñ!>Ô!>Ñ>ˆØÔ" QÒ&×+Ò+°Ð+Ñ4Ô4ˆÝ”XÔ(×0Ò0Ø�ŒJ×Ò 2ÐÑ&Ô&¨Ô(=¸bÔ(Añ
ô 
ç
Š"ˆT‰(Œ(ð 	ˆT‰
ð ˆr   c                 ó”   — | j                              dd¦  «        }| j         || j         z
  z  |                     d¦  «        |dz   z  z  S )Nr   Té   r)   )r   r   Úpow)r2   Úcon0s     r   ÚvariancezDirichlet.variancef   sP   € àÔ!×%Ò% b¨$Ñ/Ô/ˆàÔØ�dÔ(Ñ(ñ*à�xŠx˜‰{Œ{˜d Q™hÑ'ñ)ð	
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   rD   )r   Úsizer   r   rG   Údigamma)r2   ÚkÚa0s      r   ÚentropyzDirichlet.entropyo   s²   € ØÔ×#Ò# BÑ'Ô'ˆØÔ×#Ò# BÑ'Ô'ˆåŒL˜Ô+Ñ,Ô,×0Ò0°Ñ4Ô4ÝŒl˜2ÑÔñà�2‰v�œ rÑ*Ô*Ñ*ñ+ð Ô" SÑ(­E¬M¸$Ô:LÑ,MÔ,MÑM×RÒRÐSUÑVÔVñWð	
r   c                 ó   — | j         fS r   )r   rK   s    r   Ú_natural_paramszDirichlet._natural_paramsy   s   € àÔ"Ð$Ð$r   c                 ó    — |                      ¦   «                              d¦  «        t          j         |                     d¦  «        ¦  «        z
  S )Nr   )rG   r   r   )r2   r   s     r   Ú_log_normalizerzDirichlet._log_normalizer}   s5   € Ø�xŠx‰zŒz�~Š~˜bÑ!Ô!¥E¤L°·²°r±´Ñ$;Ô$;Ñ;Ð;r   r   )r'   )r#   r$   r%   Ú__doc__r   ÚindependentÚpositiveÚarg_constraintsÚsimplexÚsupportÚhas_rsampler1   r9   r   r   ÚTensorrB   rI   ÚpropertyrL   rX   r^   rd   rf   rh   Ú__classcell__)r5   s   @r   r   r   "   s`  ø€ € € € € ðð ð 	Ð0˜Ô0°Ô1EÀqÑIÔIð€Oð Ô!€GØ€KðPð Pð Pð Pð Pð Pðð ð ð ð ð ð/ð / Eð /°5´<ð /ð /ð /ð /ð

ð 
ð 
ð ðEð Eñ „XðEð ðð ñ „Xðð ð
ð 
ñ „Xð
ð
ð 
ð 
ð ð%ð %ñ „Xð%ð<ð <ð <ð <ð <ð <ð <r   )r   Útorch.autogradr   Útorch.autograd.functionr   Útorch.distributionsr   Útorch.distributions.exp_familyr   Útorch.typesr   Ú__all__r   r   r   r'   r   r   ú<module>ry      sô   ðà €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø +Ð +Ð +Ð +Ð +Ð +Ø <Ð <Ð <Ð <Ð <Ð <Ø Ð Ð Ð Ð Ð ð ˆ-€ðBð Bð BðBð Bð Bð Bð B�ñ Bô Bð Bð\<ð \<ð \<ð \<ð \<Ð!ñ \<ô \<ð \<ð \<ð \<r   