a
    MSicŽy  ã                   @   sT  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!„ ZFeG d"d#„ d#eGƒƒZHd$d%„ ZId&d'„ ZJd(d)„ ZKd*d+„ ZLd,d-„ ZMeFeeƒd.d/„ ƒZNeFeeƒd0d1„ ƒZOeFeeƒd2d3„ ƒZPeFeeƒd4d5„ ƒZQeFeeƒd6d7„ ƒZReFeeƒd8d9„ ƒZSeFeeƒd:d;„ ƒZTeFeeƒd<d=„ ƒZUeFe!e!ƒd>d?„ ƒZVeFe%e%ƒd@dA„ ƒZWeFe#e#ƒdBdC„ ƒZXeFe'e'ƒdDdE„ ƒZYeFe+e+ƒdFdG„ ƒZZeFe-e-ƒdHdI„ ƒZ[eFe1e-ƒdJdK„ ƒZ\eFe-e1ƒdLdM„ ƒZ]eFe1e1ƒdNdO„ ƒZ^eFe4e4ƒdPdQ„ ƒZ_eFe6e6ƒdRdS„ ƒZ`eFe8e8ƒdTdU„ ƒZaeFe:e:ƒdVdW„ ƒZbeFe<e<ƒdXdY„ ƒZceFe>e>ƒdZd[„ ƒZdeFee:ƒd\d]„ ƒZeeFeeƒd^d_„ ƒZfeFee8ƒd`da„ ƒZgeFeeƒdbdc„ ƒZheFee!ƒddde„ ƒZieFee4ƒdfdg„ ƒZjeFee>ƒdhdi„ ƒZkeFee8ƒdjdk„ ƒZleFeeƒdldm„ ƒZmeFee4ƒdndo„ ƒZneFee>ƒdpdq„ ƒZoeFeeƒeFeeƒeFee8ƒeFee>ƒdrds„ ƒƒƒƒZpeFee!ƒdtdu„ ƒZqeFee%ƒdvdw„ ƒZreFee4ƒdxdy„ ƒZseFe!eƒeFe!eƒeFe!e8ƒeFe!e>ƒdzd{„ ƒƒƒƒZteFe!eƒd|d}„ ƒZueFe!e%ƒd~d„ ƒZveFe!e4ƒd€d„ ƒZweFe%eƒeFe%eƒeFe%eƒeFe%e!ƒeFe%e8ƒeFe%e>ƒd‚dƒ„ ƒƒƒƒƒƒZxeFe%e4ƒd„d…„ ƒZyeFe+eƒeFe+eƒeFe+eƒeFe+e!ƒeFe+e8ƒeFe+e>ƒd†d‡„ ƒƒƒƒƒƒZzeFe+e4ƒdˆd‰„ ƒZ{eFe4eƒeFe4eƒeFe4eƒeFe4e!ƒeFe4e8ƒeFe4e>ƒdŠd‹„ ƒƒƒƒƒƒZ|eFe4e%ƒdŒd„ ƒZ}eFe4e+ƒdŽd„ ƒZ~eFe8eƒeFe8eƒeFe8e>ƒdd‘„ ƒƒƒZeFe8eƒd’d“„ ƒZ€eFe8e!ƒd”d•„ ƒZeFe8e4ƒd–d—„ ƒZ‚eFe:eƒ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>e%ƒd¢d£„ ƒZˆeFe>e4ƒd¤d¥„ ƒZ‰eFe>e8ƒd¦d§„ ƒZŠeFe)e)ƒd¨d©„ ƒZ‹eFe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_MEMOIZEc                    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© úR/var/www/html/django/DPS/env/lib/python3.9/site-packages/torch/distributions/kl.pyÚ	decoratorG   s    zregister_kl.<locals>.decorator)Ú
isinstanceÚtypeÚ
issubclassr   Ú	TypeErrorÚformat)r,   r-   r0   r.   r+   r/   Úregister_kl(   s    r6   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   r.   r.   r/   Ú__init__S   s    z_Match.__init__c                 C   s   | j |j kS r'   r9   )r:   Úotherr.   r.   r/   Ú__eq__V   s    z_Match.__eq__c                 C   s8   t | j|jƒD ]$\}}t||ƒs& dS ||ur q4qdS )NFT)Úzipr8   r3   )r:   r<   ÚxÚyr.   r.   r/   Ú__le__Y   s    
z_Match.__le__N)Ú__name__Ú
__module__Ú__qualname__Ú	__slots__r;   r=   rA   r.   r.   r.   r/   r7   O   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 }||u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 r.   )r3   )Ú.0Zsuper_pZsuper_qr+   r.   r/   Ú
<listcomp>f   s   ÿz _dispatch_kl.<locals>.<listcomp>c                 s   s   | ]}t |Ž V  qd S r'   )r7   ©rF   Úmr.   r.   r/   Ú	<genexpr>m   ó    z_dispatch_kl.<locals>.<genexpr>c                 s   s   | ]}t t|ƒŽ V  qd S r'   )r7   ÚreversedrH   r.   r.   r/   rJ   n   rK   z;Ambiguous kl_divergence({}, {}). Please register_kl({}, {}))	r(   ÚNotImplementedÚminr8   ÚwarningsÚwarnr5   rB   ÚRuntimeWarning)	r,   r-   ÚmatchesZleft_pZleft_qZright_qZright_pZleft_funZ	right_funr.   r+   r/   Ú_dispatch_klb   s    ÿþrS   c                 C   s   t  | t¡S )zI
    Helper function for obtaining infinite KL Divergence throughout
    )ÚtorchÚ	full_liker   ©Útensorr.   r.   r/   Ú_infinite_likex   s    rX   c                 C   s   | |   ¡  S )z2
    Utility function for calculating x log x
    )ÚlogrV   r.   r.   r/   Ú_x_log_x   s    rZ   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)ÚsizeÚreshapeÚpowÚsumÚshape)ÚbmatÚnrI   Z
flat_tracer.   r.   r/   Ú_batch_trace_XXT†   s    

re   c                 C   s|   zt t| ƒt|ƒf }W n8 tyP   tt| ƒt|ƒƒ}|t t| ƒt|ƒf< Y n0 |tu rrt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&   r2   ÚKeyErrorrS   rM   ÚNotImplementedErrorr5   Ú	__class__rB   )ÚpÚqr*   r.   r.   r/   Úkl_divergence   s    ÿrk   c                 C   sx   | j | j |j   ¡  }t||j dk< d|| j dk< d| j  d| j  d|j    ¡  }t||j dk< d|| j dk< || S ©Nr   r   )ÚprobsrY   r   ©ri   rj   Út1Út2r.   r.   r/   Ú_kl_bernoulli_bernoulliµ   s    "rq   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)	ri   rj   Zsum_params_pZsum_params_qro   rp   Út3Út4Út5r.   r.   r/   Ú_kl_beta_betaÀ   s    ry   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)Útotal_countÚanyrg   rm   ÚlogitsÚlog1prX   )ri   rj   ÚklZinf_idxsr.   r.   r/   Ú_kl_binomial_binomialÌ   s    0r   c                 C   sD   | j | j|j  }t||j dk |¡< d|| j dk |¡< | d¡S )Nr   r[   )rm   r|   r   Ú	expand_asra   )ri   rj   Útr.   r.   r/   Ú_kl_categorical_categoricalØ   s    r‚   c                 C   sL   | j | j|j  }|  ¡ t | j ¡ }| ¡  t |j ¡ }|| | S r'   )Úmeanr|   Ú_cont_bern_log_normrT   r}   rm   ©ri   rj   ro   rp   rv   r.   r.   r/   Ú-_kl_continuous_bernoulli_continuous_bernoullià   s    r†   c                 C   s|   | j  d¡}|j  d¡}| ¡ | ¡  }| j  ¡ |j  ¡   d¡}| j |j  }| j  ¡ | ¡  d¡ }|| ||  d¡ S )Nr[   )Úconcentrationra   rt   ru   Ú	unsqueeze)ri   rj   Zsum_p_concentrationZsum_q_concentrationro   rp   rv   rw   r.   r.   r/   Ú_kl_dirichlet_dirichletè   s    r‰   c                 C   s"   |j | j  }| ¡  }|| d S ©Nr   ©ÚraterY   )ri   rj   Z
rate_ratioro   r.   r.   r/   Ú_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 r.   )ÚdetachÚrequires_grad_)rF   Únpr.   r.   r/   rG      rK   z+_kl_expfamily_expfamily.<locals>.<listcomp>T)Úcreate_graph)r2   rg   Ú_natural_paramsÚ_log_normalizerrT   ÚautogradÚgradra   r>   r$   ÚlenÚevent_shape)ri   rj   Z	p_nparamsZ	q_nparamsÚ	lg_normalÚ	gradientsÚresultZpnpZqnpÚgÚtermr.   r.   r/   Ú_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Œ   rY   rT   rt   ru   ©ri   rj   ro   rp   rv   rw   r.   r.   r/   Ú_kl_gamma_gamma  s
    rŸ   c                 C   sl   | j |j  }|j|j  }| j|j  }| ¡  | | }|t }t |d|  ¡  | ¡}|| | dt  S rŠ   )ÚscaleÚlocrY   Ú_euler_gammarT   Úexprt   )ri   rj   Úct1Úct2Úct3ro   rp   rv   r.   r.   r/   Ú_kl_gumbel_gumbel  s    r§   c                 C   s$   |   ¡  t |j ¡| j  |j S r'   )ÚentropyrT   r}   rm   r|   ©ri   rj   r.   r.   r/   Ú_kl_geometric_geometric  s    rª   c                 C   s   t | j|jƒS r'   )Ú_kl_normal_normalÚ	base_distr©   r.   r.   r/   Ú_kl_halfnormal_halfnormal$  s    r­   c                 C   sV   | j |j  }| j|j  ¡ }| ¡  }||j  }|t | | j  ¡ }|| | d S rŠ   )r    r¡   ÚabsrY   rT   r£   )ri   rj   Úscale_ratioZloc_abs_diffro   rp   rv   r.   r.   r/   Ú_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 computedr\   F©Úupperr[   ç      à?r   )r—   Ú
ValueErrorr   Ú_unbroadcasted_cov_factorÚ_unbroadcasted_cov_diagÚ_capacitance_trilr   r¡   ÚmTrˆ   rT   ÚlinalgÚsolve_triangularra   re   ÚrsqrtÚsqrtÚmatmul)ri   rj   Úterm1Úterm3Ú	qWt_qDinvÚAÚterm21Úterm22Zterm23Zterm24Úterm2r.   r.   r/   Ú7_kl_lowrankmultivariatenormal_lowrankmultivariatenormal4  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]   r\   r[   ©Údim1Údim2Fr±   r³   r   )r—   r´   r   rµ   r¶   r·   Ú_unbroadcasted_scale_trilÚdiagonalrY   ra   r   r¡   r¸   rˆ   rT   r¹   rº   re   r»   r½   )	ri   rj   r¾   r¿   rÀ   rÁ   rÂ   rÃ   rÄ   r.   r.   r/   Ú0_kl_multivariatenormal_lowrankmultivariatenormalP  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]   r\   r[   rÇ   r   Fr±   r³   )r—   r´   rÊ   rË   rY   ra   r   rµ   r¶   r·   r   r¡   rT   Ú_CÚ_infer_sizerb   ÚexpandZ
cov_factorr^   Ú
diag_embedr¼   re   r¹   rº   )ri   rj   r¾   r¿   Úcombined_batch_shaperd   Úq_scale_trilZp_cov_factorZ
p_cov_diagrÂ   rÃ   rÄ   r.   r.   r/   Ú0_kl_lowrankmultivariatenormal_multivariatenormali  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 computedr\   r[   rÇ   r   Fr±   r³   )r—   r´   rÊ   rË   rY   ra   rT   rÍ   rÎ   rb   rÏ   re   r¹   rº   r   r¡   )	ri   rj   Z
half_term1rÑ   rd   rÒ   Zp_scale_trilrÄ   r¿   r.   r.   r/   Ú)_kl_multivariatenormal_multivariatenormalƒ  s    ÿÿ
rÔ   c                 C   sB   | j |j   d¡}| j|j |j   d¡}d|| d | ¡   S ©Nr]   r³   r   ©r    r`   r¡   rY   )ri   rj   Z	var_ratioro   r.   r.   r/   r«   –  s    r«   c                 C   s   t | j|jƒS r'   )r‚   Z_categoricalr©   r.   r.   r/   Ú'_kl_onehotcategorical_onehotcategorical  s    r×   c                 C   sX   | j |j  }|j| j }|j| ¡  }| ¡  }|| | d }t|| jj|jjk < |S rŠ   )r    ÚalpharY   r   ÚsupportÚlower_bound)ri   rj   r¯   Zalpha_ratioro   rp   rš   r.   r.   r/   Ú_kl_pareto_pareto¢  s    
rÛ   c                 C   s&   | j | j  ¡ |j  ¡   | j |j   S r'   r‹   r©   r.   r.   r/   Ú_kl_poisson_poisson®  s    rÜ   c                 C   s.   | j |j krt‚| j|jkr t‚t| j|jƒS r'   )Ú
transformsrg   r—   rk   r¬   r©   r.   r.   r/   Ú_kl_transformed_transformed³  s
    rÞ   c                 C   s<   |j |j | j | j   ¡ }t||j| jk|j | j k B < |S r'   )ÚhighÚlowrY   r   ©ri   rj   rš   r.   r.   r/   Ú_kl_uniform_uniform¼  s    râ   c                 C   s    |   ¡  | j|j ¡  |j  S r'   )r¨   rm   rŒ   rY   r©   r.   r.   r/   Ú_kl_bernoulli_poissonÄ  s    rã   c                 C   s,   |   ¡  | j|j  t |j ¡ | ¡  S r'   )r¨   rƒ   r|   rT   r}   rm   r„   r©   r.   r.   r/   Ú_kl_beta_continuous_bernoulliÉ  s    rä   c                 C   s
   t | jƒS r'   )rX   rr   r©   r.   r.   r/   Ú_kl_beta_infinityÎ  s    rå   c                 C   s,   |   ¡  |j ¡  |j| j| j| j    S r'   )r¨   rŒ   rY   rr   rs   r©   r.   r.   r/   Ú_kl_beta_exponentialÓ  s    ræ   c                 C   sp   |   ¡  }|j ¡ |j|j ¡   }|jd | j ¡ | j| j  ¡   }|j| j | j| j  }|| | | S rŠ   )r¨   r‡   rt   rŒ   rY   rr   ru   rs   rž   r.   r.   r/   Ú_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Õ   )	rr   rs   r    r`   r¨   ÚmathÚpirY   r¡   )	ri   rj   ZE_betaÚ
var_normalro   rp   rv   rw   rx   r.   r.   r/   Ú_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à   rY   r   rÙ   rÚ   Úupper_boundrá   r.   r.   r/   Ú_kl_beta_uniformï  s     rí   c                 C   s
   t | jƒS r'   )rX   rm   r©   r.   r.   r/   Ú!_kl_continuous_bernoulli_infinityø  s    rî   c                 C   s"   |   ¡  t |j¡ |j| j  S r'   )r¨   rT   rY   rŒ   rƒ   r©   r.   r.   r/   Ú$_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è   rY   ré   rT   Úsquarer¡   r    Úvariancerƒ   r…   r.   r.   r/   Ú_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à   rY   rT   ÚwhereÚmaxÚgerÙ   rÚ   Úlerì   Ú	ones_liker   rá   r.   r.   r/   Ú _kl_continuous_bernoulli_uniform  s    ÿþrø   c                 C   s
   t | jƒS r'   ©rX   rŒ   r©   r.   r.   r/   Ú_kl_exponential_infinity  s    rú   c                 C   sB   |j | j  }|j t |¡ }|| |j ¡  |jt  dt  S rŠ   )rŒ   r‡   rT   rY   rt   r¢   )ri   rj   Úratioro   r.   r.   r/   Ú_kl_exponential_gamma  s    rü   c                 C   sR   | j |j }|j|j }| ¡ d }t |¡| |d  }| ¡ }|| | | S rŠ   )rŒ   r    r¡   rY   rT   r£   Ú
reciprocal)ri   rj   Úscale_rate_prodÚloc_scale_ratioro   rp   rv   r.   r.   r/   Ú_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   rY   rè   ré   rý   r¡   )ri   rj   rê   Zrate_sqrro   rp   rv   rw   r.   r.   r/   Ú_kl_exponential_normal0  s    r  c                 C   s
   t | jƒS r'   )rX   r‡   r©   r.   r.   r/   Ú_kl_gamma_infinity;  s    r  c                 C   s&   |   ¡  |j ¡  |j| j | j  S r'   )r¨   rŒ   rY   r‡   r©   r.   r.   r/   Ú_kl_gamma_exponentialC  s    r  c                 C   s~   | j |j }|j|j }| jd | j ¡  | j ¡  | j }| ¡ | j|  }t |¡d| 	¡   
| j ¡ | }|| | S rŠ   )rŒ   r    r¡   r‡   ru   rt   rY   rT   r£   rý   r`   )ri   rj   Zbeta_scale_prodrÿ   ro   rp   rv   r.   r.   r/   Ú_kl_gamma_gumbelH  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   rY   rè   ré   r‡   rt   r¡   ru   )ri   rj   rê   Zbeta_sqrro   rp   rv   rw   r.   r.   r/   Ú_kl_gamma_normalT  s    ,r  c                 C   s
   t | jƒS r'   ©rX   r¡   r©   r.   r.   r/   Ú_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é   rY   r`   r¡   r¢   )ri   rj   Zparam_ratioro   rp   rv   r.   r.   r/   Ú_kl_gumbel_normalk  s
    &r	  c                 C   s
   t | jƒS r'   r  r©   r.   r.   r/   Ú_kl_laplace_infinityt  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   rY   rè   ré   r¡   )ri   rj   rê   Zscale_sqr_var_ratioro   rp   rv   rw   r.   r.   r/   Ú_kl_laplace_normal~  s    r  c                 C   s
   t | jƒS r'   r  r©   r.   r.   r/   Ú_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`   rY   rT   r£   rè   ré   )ri   rj   Zmean_scale_ratioZvar_scale_sqr_ratiorÿ   ro   rp   rv   r.   r.   r/   Ú_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   rY   rè   r¼   ré   r£   r`   Úerf)ri   rj   Zloc_diffr¯   Zloc_diff_scale_ratioro   rp   rv   r.   r.   r/   Ú_kl_normal_laplacež  s    

*r  c                 C   s
   t | jƒS r'   )rX   r    r©   r.   r.   r/   Ú_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Ø   rY   rý   r   )ri   rj   rþ   ro   rp   rv   rš   r.   r.   r/   Ú_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    rY   rØ   rý   r‡   rt   rŒ   r   ©ri   rj   Úcommon_termro   rp   rv   rw   rš   r.   r.   r/   Ú_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é   rY   rý   r¡   r   )	ri   rj   rê   r  ro   rp   rv   rw   rš   r.   r.   r/   Ú_kl_pareto_normalÉ  s    &
r  c                 C   s
   t | jƒS r'   rù   r©   r.   r.   r/   Ú_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   rY   rr   rZ   rs   rt   r   rÙ   rì   rÚ   r  r.   r.   r/   Ú_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ƒ   r|   rT   r}   rm   r„   ró   rô   rõ   rß   rÙ   rì   rö   rà   rÚ   r÷   r   rá   r.   r.   r/   Ú _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à   rY   r   rÙ   rÚ   rá   r.   r.   r/   Ú_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à   rY   r‡   rt   rŒ   rZ   r   rÙ   rÚ   r  r.   r.   r/   Ú_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¡   rY   rT   r£   )ri   rj   r  Zhigh_loc_diffZlow_loc_diffro   rp   r.   r.   r/   Ú_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    rY   r`   r¡   )ri   rj   r  ro   rp   rv   r.   r.   r/   Ú_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`   rY   rZ   r   rÙ   rÚ   )ri   rj   Zsupport_uniformro   rp   rš   r.   r.   r/   Ú_kl_uniform_pareto  s    r  c                 C   s*   | j |j krt‚t| j|jƒ}t|| j ƒS r'   )Úreinterpreted_batch_ndimsrg   rk   r¬   r$   rá   r.   r.   r/   Ú_kl_independent_independent"  s    r   c                 C   sD   | j |j   d¡| j|j  d¡  ¡ }d| j  |j   ¡ }|| S )Nr]   é   rÖ   rn   r.   r.   r/   Ú_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 rl   )rB   )Zp_qr.   r.   r/   Ú<lambda>5  rK   z_add_kl_info.<locals>.<lambda>)ÚkeyzG* :class:`~torch.distributions.{}` and :class:`~torch.distributions.{}`z
	N)Úsortedr(   Úappendr5   rB   Újoinrk   Ú__doc__)Úrowsri   rj   Zkl_infor.   r.   r/   Ú_add_kl_info1  s    ÿÿ
r*  )Žrè   rO   Ú	functoolsr   Útypingr   r   r   r   rT   Z
torch._sixr   Ú	bernoullir	   Úbetar
   Úbinomialr   Úcategoricalr   Úcauchyr   Úcontinuous_bernoullir   Ú	dirichletr   Údistributionr   Úexponentialr   Ú
exp_familyr   Úgammar   Ú	geometricr   Úgumbelr   Úhalf_normalr   Úindependentr   Úlaplacer   Úlowrank_multivariate_normalr   r   r   Úmultivariate_normalr   r   Únormalr   Úone_hot_categoricalr   Úparetor    Úpoissonr!   Útransformed_distributionr"   Úuniformr#   Úutilsr$   r%   r¢   r(   r&   Ú__annotations__r6   Úobjectr7   rS   rX   rZ   re   rk   rq   ry   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*  r.   r.   r.   r/   Ú<module>   s~  
'
%

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





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

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

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

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

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





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