U
    JºcKz  ã                   @   sh  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l0m1Z1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8 ddl9m:Z: ddl;m<Z< ddl=m>Z> ddl?m@Z@mAZB i ZCi ZDeeeef ef eEd< d d!gZFd"d „ ZGeG d#d$„ d$eHƒƒZId%d&„ ZJd'd(„ ZKd)d*„ ZLd+d,„ ZMeee	jNd-œd.d!„ZOeGeeƒd/d0„ ƒZPeGeeƒd1d2„ ƒZQeGeeƒd3d4„ ƒZReGeeƒd5d6„ ƒZSeGeeƒd7d8„ ƒZTeGeeƒd9d:„ ƒZUeGeeƒd;d<„ ƒZVeGeeƒd=d>„ ƒZWeGe!e!ƒd?d@„ ƒZXeGe%e%ƒdAdB„ ƒZYeGe#e#ƒdCdD„ ƒZZeGe'e'ƒdEdF„ ƒZ[eGe+e+ƒdGdH„ ƒZ\eGe-e-ƒdIdJ„ ƒZ]eGe1e-ƒdKdL„ ƒZ^eGe-e1ƒdMdN„ ƒZ_eGe1e1ƒdOdP„ ƒZ`eGe4e4ƒdQdR„ ƒZaeGe6e6ƒdSdT„ ƒZbeGe8e8ƒdUdV„ ƒZceGe:e:ƒdWdX„ ƒZdeGe<e<ƒdYdZ„ ƒZeeGe>e>ƒd[d\„ ƒZfeGee:ƒd]d^„ ƒZgeGeeƒd_d`„ ƒZheGee8ƒdadb„ ƒZieGeeƒdcdd„ ƒZjeGee!ƒdedf„ ƒZkeGee4ƒdgdh„ ƒZleGee>ƒdidj„ ƒZmeGee8ƒdkdl„ ƒZneGeeƒdmdn„ ƒZoeGee4ƒdodp„ ƒZpeGee>ƒdqdr„ ƒZqeGeeƒeGeeƒeGee8ƒeGee>ƒdsdt„ ƒƒƒƒZreGee!ƒdudv„ ƒZseGee%ƒdwdx„ ƒZteGee4ƒdydz„ ƒZueGe!eƒeGe!eƒeGe!e8ƒeGe!e>ƒd{d|„ ƒƒƒƒZveGe!eƒd}d~„ ƒZweGe!e%ƒdd€„ ƒZxeGe!e4ƒdd‚„ ƒZyeGe%eƒeGe%eƒeGe%eƒeGe%e!ƒeGe%e8ƒeGe%e>ƒdƒd„„ ƒƒƒƒƒƒZzeGe%e4ƒd…d†„ ƒZ{eGe+eƒeGe+eƒeGe+eƒeGe+e!ƒeGe+e8ƒeGe+e>ƒd‡dˆ„ ƒƒƒƒƒƒZ|eGe+e4ƒd‰dŠ„ ƒZ}eGe4eƒeGe4eƒeGe4eƒeGe4e!ƒeGe4e8ƒeGe4e>ƒd‹dŒ„ ƒƒƒƒƒƒZ~eGe4e%ƒddŽ„ ƒZeGe4e+ƒdd„ ƒZ€eGe8eƒeGe8eƒeGe8e>ƒd‘d’„ ƒƒƒZeGe8eƒd“d”„ ƒZ‚eGe8e!ƒd•d–„ ƒZƒeGe8e4ƒd—d˜„ ƒZ„eGe:eƒeGe:eƒd™dš„ ƒƒZ…eGe>eƒd›dœ„ ƒZ†eGe>eƒddž„ ƒZ‡eGe>eƒdŸd „ ƒZˆeGe>e!ƒd¡d¢„ ƒZ‰eGe>e%ƒd£d¤„ ƒZŠeGe>e4ƒd¥d¦„ ƒZ‹eGe>e8ƒd§d¨„ ƒZŒeGe)e)ƒd©dª„ ƒZeGeeƒd«d¬„ ƒZŽd­d®„ ZdS )¯é    N)Útotal_ordering)ÚTypeÚDictÚCallableÚTuple)Úinfé   )Ú	Bernoulli)ÚBeta)ÚBinomial)ÚCategorical)ÚCauchy)ÚContinuousBernoulli)Ú	Dirichlet)ÚDistribution)ÚExponential)ÚExponentialFamily)ÚGamma)Ú	Geometric)ÚGumbel)Ú
HalfNormal)ÚIndependent)ÚLaplace)ÚLowRankMultivariateNormalÚ_batch_lowrank_logdetÚ_batch_lowrank_mahalanobis)ÚMultivariateNormalÚ_batch_mahalanobis)Ú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`.
    z8Expected type_p to be a Distribution subclass but got {}z8Expected type_q to be a Distribution subclass but got {}c                    s   | t ˆ ˆf< t ¡  | S ©N)Ú_KL_REGISTRYr&   Úclear)Úfun©Útype_pÚtype_q© ú:/tmp/pip-unpacked-wheel-gikjz4vx/torch/distributions/kl.pyÚ	decoratorH   s    zregister_kl.<locals>.decorator)Ú
isinstanceÚtypeÚ
issubclassr   Ú	TypeErrorÚformat)r.   r/   r2   r0   r-   r1   r'   )   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)   ©r9   )Úselfr9   r0   r0   r1   Ú__init__T   s    z_Match.__init__c                 C   s   | j |j kS r)   r:   )r;   Úotherr0   r0   r1   Ú__eq__W   s    z_Match.__eq__c                 C   s8   t | j|jƒD ]$\}}t||ƒs& dS ||k	r q4qdS )NFT)Úzipr9   r5   )r;   r=   ÚxÚyr0   r0   r1   Ú__le__Z   s    
z_Match.__le__N)Ú__name__Ú
__module__Ú__qualname__Ú	__slots__r<   r>   rB   r0   r0   r0   r1   r8   P   s   r8   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>g   s    
 
ÿz _dispatch_kl.<locals>.<listcomp>c                 s   s   | ]}t |Ž V  qd S r)   )r8   ©rG   Úmr0   r0   r1   Ú	<genexpr>n   s     z_dispatch_kl.<locals>.<genexpr>c                 s   s   | ]}t t|ƒŽ V  qd S r)   )r8   ÚreversedrI   r0   r0   r1   rK   o   s     z;Ambiguous kl_divergence({}, {}). Please register_kl({}, {}))	r*   ÚNotImplementedÚminr9   ÚwarningsÚwarnr7   rC   ÚRuntimeWarning)	r.   r/   ÚmatchesZleft_pZleft_qZright_qZright_pZleft_funZ	right_funr0   r-   r1   Ú_dispatch_klc   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_likey   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ÚnrJ   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rttd | jj|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`.
    z8No KL(p || q) is implemented for p type {} and q type {})	r&   r4   ÚKeyErrorrS   rM   ÚNotImplementedErrorr7   Ú	__class__rC   )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    0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_)rG   Únpr0   r0   r1   rH     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ÚgZ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_gumbel  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_halfnormal%  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_laplace*  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_lowrankmultivariatenormal5  s2    
ÿ
ÿþ

þ
ÿÿ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_lowrankmultivariatenormalQ  s*    
ÿþ

þ
ÿÿ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_multivariatenormalj  s.    
ÿÿÿ
ÿ
ÿ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_uniformð  s     rØ   c                 C   s
   t | jƒS r)   )rV   ri   r˜   r0   r0   r1   Ú!_kl_continuous_bernoulli_infinityù  s    rÙ   c                 C   s"   |   ¡  t |j¡ |j| j  S r)   )r—   rT   rW   r‡   r~   r˜   r0   r0   r1   Ú$_kl_continuous_bernoulli_exponentialþ  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_normal  s    
22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_infinity  s    rã   c                 C   sB   |j | j  }|j t |¡ }|| |j ¡  |jt  dt  S r…   )r‡   r‚   rT   rW   rr   r”   )rb   rc   Zratiorm   r0   r0   r1   Ú_kl_exponential_gamma  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_normal1  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_exponentialD  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_gumbelI  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_normalU  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_normall  s
    &rñ   c                 C   s
   t | jƒS r)   rî   r˜   r0   r0   r1   Ú_kl_laplace_infinityu  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_infinity×  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_betaÝ  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_bernoullié  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_exponetialñ  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   sX   dg} t tdd„ dD ]\}}|  d |j|j¡¡ qd | ¡}tjrTt 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   )rC   )Zp_qr0   r0   r1   Ú<lambda>6  ó    z_add_kl_info.<locals>.<lambda>)ÚkeyzG* :class:`~torch.distributions.{}` and :class:`~torch.distributions.{}`z
	N)Úsortedr*   Úappendr7   rC   Újoinr(   Ú__doc__)Zrowsrb   rc   Zkl_infor0   r0   r1   Ú_add_kl_info2  s    ÿ ÿ
r  )rÓ   rO   Ú	functoolsr   Útypingr   r   r   r   rT   Z
torch._sixr   Z	bernoullir	   Úbetar
   Zbinomialr   Zcategoricalr   Zcauchyr   Zcontinuous_bernoullir   Z	dirichletr   Údistributionr   Zexponentialr   Z
exp_familyr   Ú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'   Úobjectr8   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‚   '
%













































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

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














	

