U
    ©Ê¹jÒ{  ã                   @   sf  U d dl Z d dlZd dlmZ d dlmZmZmZ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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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,m-Z-m.Z. ddl/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9Z9 ddl:m;Z; ddl<m=Z= ddl>m?Z?m@ZA i ZBi ZCeeeef ef eDd< d d!gZEd"d „ ZFeG d#d$„ d$ƒƒZGd%d&„ ZHd'd(„ ZId)d*„ ZJd+d,„ ZKeee	jLd-œd.d!„ZMeFeeƒd/d0„ ƒZNeFeeƒd1d2„ ƒZOeFeeƒd3d4„ ƒZPeFeeƒd5d6„ ƒZQeFeeƒd7d8„ ƒZReFeeƒd9d:„ ƒZSeFeeƒd;d<„ ƒZTeFeeƒd=d>„ ƒZUeFe e ƒd?d@„ ƒZVeFe$e$ƒdAdB„ ƒZWeFe"e"ƒdCdD„ ƒZXeFe&e&ƒdEdF„ ƒZYeFe*e*ƒdGdH„ ƒZZeFe.e.ƒdIdJ„ ƒZ[eFe1e.ƒdKdL„ ƒZ\eFe.e1ƒdMdN„ ƒZ]eFe1e1ƒdOdP„ ƒZ^eFe3e3ƒdQdR„ ƒZ_eFe5e5ƒdSdT„ ƒZ`eFe7e7ƒdUdV„ ƒZaeFe9e9ƒdWdX„ ƒZbeFe;e;ƒdYdZ„ ƒZceFe=e=ƒd[d\„ ƒZdeFee9ƒd]d^„ ƒZeeFeeƒd_d`„ ƒZfeFee7ƒdadb„ ƒZgeFeeƒdcdd„ ƒZheFee ƒdedf„ ƒZieFee3ƒdgdh„ ƒZjeFee=ƒdidj„ ƒZkeFee7ƒdkdl„ ƒZleFeeƒdmdn„ ƒZmeFee3ƒdodp„ ƒZneFee=ƒdqdr„ ƒZoeFeeƒeFeeƒeFee7ƒeFee=ƒdsdt„ ƒƒƒƒZpeFee ƒdudv„ ƒZqeFee$ƒdwdx„ ƒZreFee3ƒdydz„ ƒZseFe eƒeFe eƒeFe e7ƒeFe e=ƒd{d|„ ƒƒƒƒZteFe eƒd}d~„ ƒZueFe e$ƒdd€„ ƒZveFe e3ƒd�d‚„ ƒZweFe$eƒeFe$eƒeFe$eƒeFe$e ƒeFe$e7ƒeFe$e=ƒdƒd„„ ƒƒƒƒƒƒZxeFe$e3ƒd…d†„ ƒZyeFe*eƒeFe*eƒeFe*eƒeFe*e ƒeFe*e7ƒeFe*e=ƒd‡dˆ„ ƒƒƒƒƒƒZzeFe*e3ƒd‰dŠ„ ƒZ{eFe3eƒeFe3eƒeFe3eƒeFe3e ƒeFe3e7ƒeFe3e=ƒd‹dŒ„ ƒƒƒƒƒƒZ|eFe3e$ƒd�dŽ„ ƒZ}eFe3e*ƒd�d�„ ƒZ~eFe7eƒeFe7eƒeFe7e=ƒd‘d’„ ƒƒƒZeFe7eƒd“d”„ ƒZ€eFe7e ƒd•d–„ ƒZ�eFe7e3ƒd—d˜„ ƒZ‚eFe9eƒeFe9eƒd™dš„ ƒƒZƒeFe=eƒd›dœ„ ƒZ„eFe=eƒd�dž„ ƒZ…eFe=eƒdŸd „ ƒZ†eFe=e ƒd¡d¢„ ƒZ‡eFe=e$ƒd£d¤„ ƒZˆeFe=e3ƒd¥d¦„ ƒZ‰eFe=e7ƒd§d¨„ ƒZŠeFe(e(ƒd©dª„ ƒZ‹eFeeƒd«d¬„ ƒZŒd­d®„ Z�dS )¯é    N)Útotal_ordering)ÚCallableÚDictÚTupleÚType)Úinfé   )Ú	Bernoulli)ÚBeta)ÚBinomial)ÚCategorical)ÚCauchy)ÚContinuousBernoulli)Ú	Dirichlet)ÚDistribution)ÚExponentialFamily)ÚExponential)ÚGamma)Ú	Geometric)ÚGumbel)Ú
HalfNormal)ÚIndependent)ÚLaplace)Ú_batch_lowrank_logdetÚ_batch_lowrank_mahalanobisÚLowRankMultivariateNormal)Ú_batch_mahalanobisÚMultivariateNormal)ÚNormal)ÚOneHotCategorical)ÚPareto)ÚPoisson)ÚTransformedDistribution)ÚUniform)Ú_sum_rightmostÚeuler_constantÚ_KL_MEMOIZEÚregister_klÚkl_divergencec                    sV   t ˆ tƒs"tˆ tƒr"tdˆ › �ƒ‚t ˆtƒsDtˆtƒrDtdˆ› �ƒ‚‡ ‡fdd„}|S )a[  
    Decorator to register a pairwise function with :meth:`kl_divergence`.
    Usage::

        @register_kl(Normal, Normal)
        def kl_normal_normal(p, q):
            # insert implementation here

    Lookup returns the most specific (type,type) match ordered by subclass. If
    the match is ambiguous, a `RuntimeWarning` is raised. For example to
    resolve the ambiguous situation::

        @register_kl(BaseP, DerivedQ)
        def kl_version1(p, q): ...
        @register_kl(DerivedP, BaseQ)
        def kl_version2(p, q): ...

    you should register a third most-specific implementation, e.g.::

        register_kl(DerivedP, DerivedQ)(kl_version1)  # Break the tie.

    Args:
        type_p (type): A subclass of :class:`~torch.distributions.Distribution`.
        type_q (type): A subclass of :class:`~torch.distributions.Distribution`.
    z6Expected type_p to be a Distribution subclass but got z6Expected type_q to be a Distribution subclass but got c                    s   | t ˆ ˆf< t ¡  | S ©N)Ú_KL_REGISTRYr&   Úclear)Úfun©Útype_pÚtype_q© úU/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/distributions/kl.pyÚ	decoratorT   s    zregister_kl.<locals>.decorator)Ú
isinstanceÚtypeÚ
issubclassr   Ú	TypeError)r.   r/   r2   r0   r-   r1   r'   1   s    ÿÿc                   @   s*   e Zd ZdgZdd„ Zdd„ Zdd„ ZdS )	Ú_MatchÚtypesc                 G   s
   || _ d S r)   ©r8   )Úselfr8   r0   r0   r1   Ú__init__`   s    z_Match.__init__c                 C   s   | j |j kS r)   r9   )r:   Úotherr0   r0   r1   Ú__eq__c   s    z_Match.__eq__c                 C   s8   t | j|jƒD ]$\}}t||ƒs& dS ||k	r q4qdS )NFT)Úzipr8   r5   )r:   r<   ÚxÚyr0   r0   r1   Ú__le__f   s    
z_Match.__le__N)Ú__name__Ú
__module__Ú__qualname__Ú	__slots__r;   r=   rA   r0   r0   r0   r1   r7   \   s   r7   c           	         s�   ‡ ‡fdd„t D ƒ}|stS tdd„ |D ƒƒj\}}tdd„ |D ƒƒj\}}t ||f }t ||f }||k	rŒt d ˆ jˆj|j|j¡t¡ |S )zP
    Find the most specific approximate match, assuming single inheritance.
    c                    s,   g | ]$\}}t ˆ |ƒrt ˆ|ƒr||f‘qS r0   )r5   )Ú.0Zsuper_pZsuper_qr-   r0   r1   Ú
<listcomp>s   s   
 
þz _dispatch_kl.<locals>.<listcomp>c                 s   s   | ]}t |Ž V  qd S r)   )r7   ©rF   Úmr0   r0   r1   Ú	<genexpr>}   s     z_dispatch_kl.<locals>.<genexpr>c                 s   s   | ]}t t|ƒŽ V  qd S r)   )r7   ÚreversedrH   r0   r0   r1   rJ   ~   s     z;Ambiguous kl_divergence({}, {}). Please register_kl({}, {}))	r*   ÚNotImplementedÚminr8   ÚwarningsÚwarnÚformatrB   ÚRuntimeWarning)	r.   r/   ÚmatchesZleft_pZleft_qZright_qZright_pZleft_funZ	right_funr0   r-   r1   Ú_dispatch_klo   s(    þ   ÿürS   c                 C   s   t  | t¡S )zI
    Helper function for obtaining infinite KL Divergence throughout
    )ÚtorchZ	full_liker   ©Ztensorr0   r0   r1   Ú_infinite_like‹   s    rV   c                 C   s   | |   ¡  S )z2
    Utility function for calculating x log x
    )ÚlogrU   r0   r0   r1   Ú_x_log_x’   s    rX   c                 C   sD   |   d¡}|   d¡}|  d|| ¡ d¡ d¡}| | jdd… ¡S )zp
    Utility function for calculating the trace of XX^{T} with X having arbitrary trailing batch dimensions
    éÿÿÿÿéþÿÿÿé   N)ÚsizeZreshapeÚpowÚsumÚshape)ZbmatÚnrI   Z
flat_tracer0   r0   r1   Ú_batch_trace_XXT™   s    

ra   )ÚpÚqÚreturnc                 C   s‚   zt t| ƒt|ƒf }W n: tk
rR   tt| ƒt|ƒƒ}|t t| ƒt|ƒf< Y nX |tkrxtd| jj› d|jj› �ƒ‚|| |ƒS )a"  
    Compute Kullback-Leibler divergence :math:`KL(p \| q)` between two distributions.

    .. math::

        KL(p \| q) = \int p(x) \log\frac {p(x)} {q(x)} \,dx

    Args:
        p (Distribution): A :class:`~torch.distributions.Distribution` object.
        q (Distribution): A :class:`~torch.distributions.Distribution` object.

    Returns:
        Tensor: A batch of KL divergences of shape `batch_shape`.

    Raises:
        NotImplementedError: If the distribution types have not been registered via
            :meth:`register_kl`.
    z(No KL(p || q) is implemented for p type z and q type )r&   r4   ÚKeyErrorrS   rL   ÚNotImplementedErrorÚ	__class__rB   )rb   rc   r,   r0   r0   r1   r(   £   s    ÿc                 C   s”   | j tjj |j ¡tjj | j ¡  }t||j dk< d|| j dk< d| j  tjj |j¡tjj | j¡  }t||j dk< d|| j dk< || S ©Nr   r   )ÚprobsrT   ÚnnZ
functionalZsoftplusÚlogitsr   ©rb   rc   Út1Út2r0   r0   r1   Ú_kl_bernoulli_bernoulliÉ   s    ÿÿÿro   c           	      C   s¦   | j | j }|j |j }|j  ¡ |j ¡  | ¡  }| j  ¡ | j ¡  | ¡  }| j |j  t | j ¡ }| j|j t | j¡ }|| t |¡ }|| | | | S r)   )Úconcentration1Úconcentration0ÚlgammarT   Údigamma)	rb   rc   Zsum_params_pZsum_params_qrm   rn   Út3Út4Út5r0   r0   r1   Ú_kl_beta_betaÙ   s    rw   c                 C   sh   | j |j k  ¡ rtdƒ‚| j | j| j|j  | j  ¡  |j  ¡   }| j |j k}t|| ƒ||< |S )NzKKL between Binomials where q.total_count > p.total_count is not implemented)Ztotal_countÚanyrf   ri   rk   Úlog1prV   )rb   rc   ÚklZinf_idxsr0   r0   r1   Ú_kl_binomial_binomialå   s    ÿ(ÿr{   c                 C   sD   | j | j|j  }t||j dk |¡< d|| j dk |¡< | d¡S )Nr   rY   )ri   rk   r   Z	expand_asr^   )rb   rc   Útr0   r0   r1   Ú_kl_categorical_categoricalõ   s    r}   c                 C   sL   | j | j|j  }|  ¡ t | j ¡ }| ¡  t |j ¡ }|| | S r)   )Úmeanrk   Ú_cont_bern_log_normrT   ry   ri   ©rb   rc   rm   rn   rt   r0   r0   r1   Ú-_kl_continuous_bernoulli_continuous_bernoulliý   s    r�   c                 C   s|   | j  d¡}|j  d¡}| ¡ | ¡  }| j  ¡ |j  ¡   d¡}| j |j  }| j  ¡ | ¡  d¡ }|| ||  d¡ S )NrY   )Úconcentrationr^   rr   rs   Ú	unsqueeze)rb   rc   Zsum_p_concentrationZsum_q_concentrationrm   rn   rt   ru   r0   r0   r1   Ú_kl_dirichlet_dirichlet  s    r„   c                 C   s"   |j | j  }| ¡  }|| d S ©Nr   ©ÚraterW   )rb   rc   Z
rate_ratiorm   r0   r0   r1   Ú_kl_exponential_exponential  s    
rˆ   c                 C   s˜   t | ƒt |ƒkstdƒ‚dd„ | jD ƒ}|j}| j|Ž }tjj| ¡ |dd�}|j|Ž | }t|||ƒD ]*\}}}	|| |	 }
|t	|
t
|jƒƒ8 }qh|S )Nz‡The cross KL-divergence between different exponential families cannot                             be computed using Bregman divergencesc                 S   s   g | ]}|  ¡  ¡ ‘qS r0   )ÚdetachZrequires_grad_)rF   Únpr0   r0   r1   rG     s     z+_kl_expfamily_expfamily.<locals>.<listcomp>T)Zcreate_graph)r4   rf   Z_natural_paramsZ_log_normalizerrT   ZautogradZgradr^   r>   r$   ÚlenÚevent_shape)rb   rc   Z	p_nparamsZ	q_nparamsZ	lg_normalZ	gradientsÚresultZpnpZqnpÚgÚtermr0   r0   r1   Ú_kl_expfamily_expfamily  s    ÿ
r�   c                 C   sn   |j | j|j  ¡  }t |j ¡t | j ¡ }| j |j  t | j ¡ }|j| j | j | j  }|| | | S r)   )r‚   r‡   rW   rT   rr   rs   ©rb   rc   rm   rn   rt   ru   r0   r0   r1   Ú_kl_gamma_gamma*  s
    r’   c                 C   sl   | j |j  }|j|j  }| j|j  }| ¡  | | }|t }t |d|  ¡  | ¡}|| | dt  S r…   )ÚscaleÚlocrW   Ú_euler_gammarT   Úexprr   )rb   rc   Zct1Zct2Zct3rm   rn   rt   r0   r0   r1   Ú_kl_gumbel_gumbel3  s    r—   c                 C   s$   |   ¡  t |j ¡| j  |j S r)   )ÚentropyrT   ry   ri   rk   ©rb   rc   r0   r0   r1   Ú_kl_geometric_geometric>  s    rš   c                 C   s   t | j|jƒS r)   )Ú_kl_normal_normalÚ	base_distr™   r0   r0   r1   Ú_kl_halfnormal_halfnormalC  s    r�   c                 C   sV   | j |j  }| j|j  ¡ }| ¡  }||j  }|t | | j  ¡ }|| | d S r…   )r“   r”   ÚabsrW   rT   r–   )rb   rc   Úscale_ratioZloc_abs_diffrm   rn   rt   r0   r0   r1   Ú_kl_laplace_laplaceH  s    

r    c                 C   sú   | j |j krtdƒ‚t|j|j|jƒt| j| j| jƒ }t|j|j|j| j |jƒ}|jj|j 	d¡ }t
jj|j|dd�}| j|j  d¡}t| j|j ¡  	d¡ ƒ}t|| j ¡  	d¡ ƒ}t| | j¡ƒ}	|| | |	 }
d||
 | | j d   S )NzKL-divergence between two Low Rank Multivariate Normals with                          different event shapes cannot be computedrZ   F©ÚupperrY   ç      à?r   )rŒ   Ú
ValueErrorr   Ú_unbroadcasted_cov_factorÚ_unbroadcasted_cov_diagÚ_capacitance_trilr   r”   ÚmTrƒ   rT   ÚlinalgÚsolve_triangularr^   ra   ÚrsqrtÚsqrtÚmatmul)rb   rc   Úterm1Úterm3Ú	qWt_qDinvÚAÚterm21Úterm22Zterm23Zterm24Úterm2r0   r0   r1   Ú7_kl_lowrankmultivariatenormal_lowrankmultivariatenormalS  s>    ÿ  ÿ  ÿþ
ü	ÿrµ   c           	      C   sÔ   | j |j krtdƒ‚t|j|j|jƒd| jjddd� ¡  	d¡  }t
|j|j|j| j |jƒ}|jj|j d¡ }tjj|j|dd�}t| j|j ¡  d¡ ƒ}t| | j¡ƒ}|| }d|| | | j d	   S )
Nú�KL-divergence between two (Low Rank) Multivariate Normals with                          different event shapes cannot be computedr[   rZ   rY   ©Zdim1Zdim2Fr¡   r£   r   )rŒ   r¤   r   r¥   r¦   r§   Ú_unbroadcasted_scale_trilÚdiagonalrW   r^   r   r”   r¨   rƒ   rT   r©   rª   ra   r«   r­   )	rb   rc   r®   r¯   r°   r±   r²   r³   r´   r0   r0   r1   Ú0_kl_multivariatenormal_lowrankmultivariatenormalu  s2    ÿ  ÿþ
ü	ÿrº   c                 C   s$  | j |j krtdƒ‚d|jjddd� ¡  d¡ t| j| j| j	ƒ }t
|j|j| j ƒ}tj |jjd d… | jjd d… ¡}| j d }|j |||f ¡}| j ||| j d¡f ¡}t | j ¡ ¡ |||f ¡}ttjj||dd�ƒ}	ttjj||dd�ƒ}
|	|
 }d	|| | | j d   S )
Nr¶   r[   rZ   rY   r·   r   Fr¡   r£   )rŒ   r¤   r¸   r¹   rW   r^   r   r¥   r¦   r§   r   r”   rT   Ú_CÚ_infer_sizer_   ÚexpandZ
cov_factorr\   Z
diag_embedr¬   ra   r©   rª   )rb   rc   r®   r¯   Úcombined_batch_shaper`   Úq_scale_trilZp_cov_factorZ
p_cov_diagr²   r³   r´   r0   r0   r1   Ú0_kl_lowrankmultivariatenormal_multivariatenormal“  sD    ÿÿ  ÿþ ÿ
ÿ
ÿÿÿrÀ   c           	      C   sÞ   | j |j krtdƒ‚|jjddd� ¡  d¡| jjddd� ¡  d¡ }tj |jj	d d… | jj	d d… ¡}| j d }|j 
|||f ¡}| j 
|||f ¡}ttjj||dd�ƒ}t|j|j| j ƒ}|d|| |   S )	NzvKL-divergence between two Multivariate Normals with                          different event shapes cannot be computedrZ   rY   r·   r   Fr¡   r£   )rŒ   r¤   r¸   r¹   rW   r^   rT   r»   r¼   r_   r½   ra   r©   rª   r   r”   )	rb   rc   Z
half_term1r¾   r`   r¿   Zp_scale_trilr´   r¯   r0   r0   r1   Ú)_kl_multivariatenormal_multivariatenormal¸  s*    ÿÿþ ÿ
ÿrÁ   c                 C   sB   | j |j   d¡}| j|j |j   d¡}d|| d | ¡   S ©Nr[   r£   r   ©r“   r]   r”   rW   )rb   rc   Z	var_ratiorm   r0   r0   r1   r›   Ñ  s    r›   c                 C   s   t | j|jƒS r)   )r}   Z_categoricalr™   r0   r0   r1   Ú'_kl_onehotcategorical_onehotcategoricalØ  s    rÄ   c                 C   sX   | j |j  }|j| j }|j| ¡  }| ¡  }|| | d }t|| jj|jjk < |S r…   )r“   ÚalpharW   r   ÚsupportÚlower_bound)rb   rc   rŸ   Zalpha_ratiorm   rn   r�   r0   r0   r1   Ú_kl_pareto_paretoÝ  s    
rÈ   c                 C   s&   | j | j  ¡ |j  ¡   | j |j   S r)   r†   r™   r0   r0   r1   Ú_kl_poisson_poissoné  s    rÉ   c                 C   s.   | j |j krt‚| j|jkr t‚t| j|jƒS r)   )Z
transformsrf   rŒ   r(   rœ   r™   r0   r0   r1   Ú_kl_transformed_transformedî  s
    rÊ   c                 C   s<   |j |j | j | j   ¡ }t||j| jk|j | j k B < |S r)   )ÚhighÚlowrW   r   ©rb   rc   r�   r0   r0   r1   Ú_kl_uniform_uniform÷  s    rÎ   c                 C   s    |   ¡  | j|j ¡  |j  S r)   )r˜   ri   r‡   rW   r™   r0   r0   r1   Ú_kl_bernoulli_poissonÿ  s    rÏ   c                 C   s,   |   ¡  | j|j  t |j ¡ | ¡  S r)   )r˜   r~   rk   rT   ry   ri   r   r™   r0   r0   r1   Ú_kl_beta_continuous_bernoulli  s    
ÿþýÿrÐ   c                 C   s
   t | jƒS r)   )rV   rp   r™   r0   r0   r1   Ú_kl_beta_infinity  s    rÑ   c                 C   s,   |   ¡  |j ¡  |j| j| j| j    S r)   )r˜   r‡   rW   rp   rq   r™   r0   r0   r1   Ú_kl_beta_exponential  s    ÿþÿrÒ   c                 C   sp   |   ¡  }|j ¡ |j|j ¡   }|jd | j ¡ | j| j  ¡   }|j| j | j| j  }|| | | S r…   )r˜   r‚   rr   r‡   rW   rp   rs   rq   r‘   r0   r0   r1   Ú_kl_beta_gamma  s    
ÿrÓ   c           	      C   sš   | j | j | j  }|j d¡}|  ¡  }d|d tj  ¡  }|d|  | j | j d  | d¡ d }|j| }|j d¡d }|| || | |  S rÂ   )	rp   rq   r“   r]   r˜   ÚmathÚpirW   r”   )	rb   rc   ZE_betaÚ
var_normalrm   rn   rt   ru   rv   r0   r0   r1   Ú_kl_beta_normal*  s    
ÿý
r×   c                 C   s>   |   ¡  |j|j  ¡  }t||j| jjk|j| jjk B < |S r)   )r˜   rË   rÌ   rW   r   rÆ   rÇ   Úupper_boundrÍ   r0   r0   r1   Ú_kl_beta_uniform9  s     rÙ   c                 C   s
   t | jƒS r)   )rV   ri   r™   r0   r0   r1   Ú!_kl_continuous_bernoulli_infinityC  s    rÚ   c                 C   s"   |   ¡  t |j¡ |j| j  S r)   )r˜   rT   rW   r‡   r~   r™   r0   r0   r1   Ú$_kl_continuous_bernoulli_exponentialH  s    rÛ   c                 C   sz   |   ¡  }dt dtj ¡t |j|j ¡  t |j¡ }| jt | j	¡ d|j | j	  dt |j¡  }|| | S )Nr£   g       @)
r˜   rÔ   rW   rÕ   rT   Zsquarer”   r“   Zvariancer~   r€   r0   r0   r1   Ú_kl_continuous_bernoulli_normalQ  s    
(ÿ ÿrÜ   c              	   C   sV   |   ¡  |j|j  ¡  }t t t |j| jj	¡t 
|j| jj¡¡t |¡t |¡S r)   )r˜   rË   rÌ   rW   rT   ÚwhereÚmaxÚgerÆ   rÇ   ÚlerØ   Ú	ones_liker   rÍ   r0   r0   r1   Ú _kl_continuous_bernoulli_uniform]  s    þúrâ   c                 C   s
   t | jƒS r)   ©rV   r‡   r™   r0   r0   r1   Ú_kl_exponential_infinityj  s    rä   c                 C   sB   |j | j  }|j t |¡ }|| |j ¡  |jt  dt  S r…   )r‡   r‚   rT   rW   rr   r•   )rb   rc   Úratiorm   r0   r0   r1   Ú_kl_exponential_gammar  s    ÿþýüÿræ   c                 C   sR   | j |j }|j|j }| ¡ d }t |¡| |d  }| ¡ }|| | | S r…   )r‡   r“   r”   rW   rT   r–   Ú
reciprocal)rb   rc   Úscale_rate_prodÚloc_scale_ratiorm   rn   rt   r0   r0   r1   Ú_kl_exponential_gumbel  s    rê   c                 C   sp   |j  d¡}| j d¡}dt || d tj ¡ }| ¡ }|j| j }|j d¡d }|d || | |  S rÂ   )	r“   r]   r‡   rT   rW   rÔ   rÕ   rç   r”   )rb   rc   rÖ   Zrate_sqrrm   rn   rt   ru   r0   r0   r1   Ú_kl_exponential_normalŒ  s    rë   c                 C   s
   t | jƒS r)   )rV   r‚   r™   r0   r0   r1   Ú_kl_gamma_infinity—  s    rì   c                 C   s&   |   ¡  |j ¡  |j| j | j  S r)   )r˜   r‡   rW   r‚   r™   r0   r0   r1   Ú_kl_gamma_exponentialŸ  s    rí   c                 C   s~   | j |j }|j|j }| jd | j ¡  | j ¡  | j }| ¡ | j|  }t |¡d| 	¡   
| j ¡ | }|| | S r…   )r‡   r“   r”   r‚   rs   rr   rW   rT   r–   rç   r]   )rb   rc   Zbeta_scale_prodré   rm   rn   rt   r0   r0   r1   Ú_kl_gamma_gumbel¤  s     ÿþÿÿþÿrî   c                 C   s¨   |j  d¡}| j d¡}dt || d tj ¡ | j | j ¡  }d| j d¡| j  | }|j	| j | j }d|j	 d¡ }|| jd | j 
¡   || | |  S rÂ   )r“   r]   r‡   rT   rW   rÔ   rÕ   r‚   rr   r”   rs   )rb   rc   rÖ   Zbeta_sqrrm   rn   rt   ru   r0   r0   r1   Ú_kl_gamma_normal¹  s"    ÿþÿÿþÿrï   c                 C   s
   t | jƒS r)   ©rV   r”   r™   r0   r0   r1   Ú_kl_gumbel_infinityÌ  s    rñ   c                 C   sx   | j |j  }|t dtj ¡  ¡ }tj| d  d¡d }| j| j t  |j |j   d¡d }| | | td  S )Nr[   r£   é   r   )r“   rÔ   r¬   rÕ   rW   r]   r”   r•   )rb   rc   Zparam_ratiorm   rn   rt   r0   r0   r1   Ú_kl_gumbel_normalÙ  s
    &ró   c                 C   s
   t | jƒS r)   rð   r™   r0   r0   r1   Ú_kl_laplace_infinityâ  s    rô   c                 C   s~   |j  d¡}| j  d¡| }dt d| tj ¡ }d| j d¡ }| j|j }d|j d¡ }| | || | |  d S rÂ   )r“   r]   rT   rW   rÔ   rÕ   r”   )rb   rc   rÖ   Zscale_sqr_var_ratiorm   rn   rt   ru   r0   r0   r1   Ú_kl_laplace_normalì  s    rõ   c                 C   s
   t | jƒS r)   rð   r™   r0   r0   r1   Ú_kl_normal_infinity÷  s    rö   c                 C   s|   | j |j }| j|j  d¡}|j |j }| ¡ d }|| }t | d|  | ¡}| | | ddt dtj ¡   S rÂ   )r”   r“   r]   rW   rT   r–   rÔ   rÕ   )rb   rc   Zmean_scale_ratioZvar_scale_sqr_ratioré   rm   rn   rt   r0   r0   r1   Ú_kl_normal_gumbel  s    r÷   c                 C   sš   | j |j  }| j|j }|| j }t |¡}t dtj ¡| j t d| d¡ ¡ }|t 	t d¡| ¡ }| || |j  ddt dtj ¡   S )Nr[   g      à¿r£   r   )
r”   r“   rT   rW   rÔ   r¬   rÕ   r–   r]   Úerf)rb   rc   Zloc_diffrŸ   Zloc_diff_scale_ratiorm   rn   rt   r0   r0   r1   Ú_kl_normal_laplace  s    

(ÿrù   c                 C   s
   t | jƒS r)   )rV   r“   r™   r0   r0   r1   Ú_kl_pareto_infinity  s    rú   c                 C   sZ   | j |j }| j|  ¡ }| j ¡ }| j| | jd  }|| | d }t|| jdk< |S r…   )r“   r‡   rÅ   rW   rç   r   )rb   rc   rè   rm   rn   rt   r�   r0   r0   r1   Ú_kl_pareto_exponential   s    
rû   c                 C   sŒ   | j  ¡ | j ¡  }| j ¡ | }|j ¡ |j|j ¡   }d|j | }|j| j | j  | jd  }|| | | d }t|| jdk< |S r…   )r“   rW   rÅ   rç   r‚   rr   r‡   r   ©rb   rc   Úcommon_termrm   rn   rt   ru   r�   r0   r0   r1   Ú_kl_pareto_gamma+  s    rþ   c           	      C   sª   d|j  d¡ }| j | jd  }t dtj ¡|j  | j | j   ¡ }| j ¡ }| j| d¡ | jd  }| j| |j  d¡}|| || |  d }t	|| jdk< |S )Nr[   r   )
r“   r]   rÅ   rÔ   r¬   rÕ   rW   rç   r”   r   )	rb   rc   rÖ   rý   rm   rn   rt   ru   r�   r0   r0   r1   Ú_kl_pareto_normal:  s    &
rÿ   c                 C   s
   t | jƒS r)   rã   r™   r0   r0   r1   Ú_kl_poisson_infinityG  s    r   c                 C   sÂ   | j | j }t |¡}|jd t| j ƒt| jƒ |  | }|jd td| j  ƒtd| j ƒ |  | }|j ¡ |j ¡  |j|j  ¡  }|| | | }t|| j |j	j
k| j|j	jk B < |S r…   )rË   rÌ   rT   rW   rp   rX   rq   rr   r   rÆ   rØ   rÇ   rü   r0   r0   r1   Ú_kl_uniform_betaM  s.    
ÿþÿÿþÿÿþÿ r  c              	   C   sh   |   ¡  | j|j  t |j ¡ | ¡  }t t t 	| j
|jj¡t | j|jj¡¡t |¡t |¡S r)   )r˜   r~   rk   rT   ry   ri   r   rÝ   rÞ   rß   rË   rÆ   rØ   rà   rÌ   rÇ   rá   r   rÍ   r0   r0   r1   Ú _kl_uniform_continuous_bernoullie  s     
ÿþýÿþúr  c                 C   sB   |j | j| j  d | j| j |j   ¡  }t|| j|jjk < |S )Nr[   )r‡   rË   rÌ   rW   r   rÆ   rÇ   rÍ   r0   r0   r1   Ú_kl_uniform_exponetialw  s    ,r  c                 C   s’   | j | j }| ¡ }|j ¡ |j|j ¡   }d|j t| j ƒt| jƒ |  | }|j| j | j  d }| | | | }t|| j|jj	k < |S )Nr   r[   )
rË   rÌ   rW   r‚   rr   r‡   rX   r   rÆ   rÇ   rü   r0   r0   r1   Ú_kl_uniform_gamma~  s    ÿþÿr  c                 C   sn   |j | j| j  }| j|j |j  }| j|j |j  }| ¡ d||   }|t | ¡t | ¡  }|| S )Nr£   )r“   rË   rÌ   r”   rW   rT   r–   )rb   rc   rý   Zhigh_loc_diffZlow_loc_diffrm   rn   r0   r0   r1   Ú_kl_uniform_gumbelŽ  s    r  c                 C   st   | j | j }t tjd ¡|j |  ¡ }| d¡d }| j | j d|j  d  d¡}|d||  |j d¡  S )Nr[   é   r£   )	rË   rÌ   rÔ   r¬   rÕ   r“   rW   r]   r”   )rb   rc   rý   rm   rn   rt   r0   r0   r1   Ú_kl_uniform_normal›  s
     r  c                 C   sl   | j | j }|j|j |j¡ |  ¡ }t| j ƒt| jƒ | | }||jd  | }t|| j|jj	k < |S r…   )
rË   rÌ   rÅ   r“   r]   rW   rX   r   rÆ   rÇ   )rb   rc   Zsupport_uniformrm   rn   r�   r0   r0   r1   Ú_kl_uniform_pareto¤  s    r  c                 C   s*   | j |j krt‚t| j|jƒ}t|| j ƒS r)   )Zreinterpreted_batch_ndimsrf   r(   rœ   r$   rÍ   r0   r0   r1   Ú_kl_independent_independent®  s    r	  c                 C   sD   | j |j   d¡| j|j  d¡  ¡ }d| j  |j   ¡ }|| S )Nr[   é   rÃ   rl   r0   r0   r1   Ú_kl_cauchy_cauchy¶  s    (r  c                  C   s^   dg} t tdd„ d�D ]$\}}|  d|j› d|j› d�¡ qd | ¡}tjrZt j|7  _d	S )
zHAppends a list of implemented KL functions to the doc for kl_divergence.zLKL divergence is currently implemented for the following distribution pairs:c                 S   s   | d j | d j fS rh   )rB   )Zp_qr0   r0   r1   Ú<lambda>Ä  ó    z_add_kl_info.<locals>.<lambda>)Úkeyz* :class:`~torch.distributions.z#` and :class:`~torch.distributions.ú`z
	N)Úsortedr*   ÚappendrB   Újoinr(   Ú__doc__)Úrowsrb   rc   Zkl_infor0   r0   r1   Ú_add_kl_info¾  s    ÿ ÿÿ
r  )ŽrÔ   rN   Ú	functoolsr   Útypingr   r   r   r   rT   r   Z	bernoullir	   Úbetar
   Zbinomialr   Zcategoricalr   Zcauchyr   Zcontinuous_bernoullir   Z	dirichletr   Údistributionr   Z
exp_familyr   Zexponentialr   Úgammar   Z	geometricr   Zgumbelr   Zhalf_normalr   Zindependentr   Zlaplacer   Zlowrank_multivariate_normalr   r   r   Zmultivariate_normalr   r   Únormalr   Zone_hot_categoricalr   Zparetor    Zpoissonr!   Ztransformed_distributionr"   Úuniformr#   Úutilsr$   r%   r•   r*   r&   Ú__annotations__Ú__all__r'   r7   rS   rV   rX   ra   ZTensorr(   ro   rw   r{   r}   r�   r„   rˆ   r�   r’   r—   rš   r�   r    rµ   rº   rÀ   rÁ   r›   rÄ   rÈ   rÉ   rÊ   rÎ   rÏ   rÐ   rÑ   rÒ   rÓ   r×   rÙ   rÚ   rÛ   rÜ   râ   rä   ræ   rê   rë   rì   rí   rî   rï   rñ   ró   rô   rõ   rö   r÷   rù   rú   rû   rþ   rÿ   r   r  r  r  r  r  r  r  r	  r  r  r0   r0   r0   r1   Ú<module>   sŠ   ÿþÿ+
&















!

$








	




	



























	

