o
    i|                     @   sx  U d dl Z d dlZd dlmZ d dlmZ d dlZd dlmZ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-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9Z9 ddl:m;Z; ddl<m=Z=m>Z? i Z@eAeBeCeCf ef eDd< i ZEeAeBeCeCf ef eDd < d!d"gZFd#d! ZGeG d$d% d%ZHd&d' ZId(d) ZJd*d+ ZKd,d- ZLd.ed/ed0efd1d"ZMeGe
e
d2d3 ZNeGeed4d5 ZOeGeed6d7 ZPeGeed8d9 ZQeGeed:d; ZReGeed<d= ZSeGeed>d? ZTeGeed@dA ZUeGeedBdC ZVeGe"e"dDdE ZWeGe e dFdG ZXeGe$e$dHdI ZYeGe(e(dJdK ZZeGe,e,dLdM Z[eGe/e,dNdO Z\eGe,e/dPdQ Z]eGe/e/dRdS Z^eGe1e1dTdU Z_eGe3e3dVdW Z`eGe5e5dXdY ZaeGe7e7dZd[ ZbeGe9e9d\d] ZceGe;e;d^d_ ZdeGe
e7d`da ZeeGeedbdc ZfeGee5ddde ZgeGeedfdg ZheGeedhdi ZieGee1djdk ZjeGee;dldm ZkeGee5dndo ZleGeedpdq ZmeGee1drds ZneGee;dtdu ZoeGeeeGeeeGee5eGee;dvdw ZpeGeedxdy ZqeGee"dzd{ ZreGee1d|d} ZseGeeeGeeeGee5eGee;d~d ZteGeedd ZueGee"dd ZveGee1dd ZweGe"eeGe"eeGe"eeGe"eeGe"e5eGe"e;dd ZxeGe"e1dd ZyeGe(eeGe(eeGe(eeGe(eeGe(e5eGe(e;dd ZzeGe(e1dd Z{eGe1eeGe1eeGe1eeGe1eeGe1e5eGe1e;dd Z|eGe1e"dd Z}eGe1e(dd Z~eGe5eeGe5eeGe5e;dd ZeGe5edd ZeGe5edd ZeGe5e1dd ZeGe7e
eGe7edd ZeGe;edd ZeGe;edd ZeGe;edd ZeGe;edd ZeGe;e"dd ZeGe;e1dd ZeGe;e5dd ZeGe&e&dd ZeGeedd Zdd ZdS )    N)Callable)total_ordering)infTensor   )	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_REGISTRY_KL_MEMOIZEregister_klkl_divergencec                    sV   t  tst trtd  t ts"ttr"t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)r$   r%   clear)funtype_ptype_q X/sda-disk/www/egybert/egybert_env/lib/python3.10/site-packages/torch/distributions/kl.py	decoratorV   s   zregister_kl.<locals>.decorator)
isinstancetype
issubclassr   	TypeError)r,   r-   r0   r.   r+   r/   r&   3   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(   r6   )selfr6   r.   r.   r/   __init__b   s   
z_Match.__init__c                 C   s   | j |j kS r(   r7   )r8   otherr.   r.   r/   __eq__e   s   z_Match.__eq__c                 C   s:   t | j|jD ]\}}t||s dS ||ur dS qdS )NFT)zipr6   r3   )r8   r:   xyr.   r.   r/   __le__h   s   
z_Match.__le__N)__name__
__module____qualname__	__slots__r9   r;   r?   r.   r.   r.   r/   r5   ^   s
    r5   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rOtjd j dj d|j d|j d		td
d |S )zP
    Find the most specific approximate match, assuming single inheritance.
    c                    s,   g | ]\}}t  |rt |r||fqS r.   )r3   ).0super_psuper_qr+   r.   r/   
<listcomp>u   s    z _dispatch_kl.<locals>.<listcomp>c                 s   s    | ]}t | V  qd S r(   )r5   rD   mr.   r.   r/   	<genexpr>   s    z_dispatch_kl.<locals>.<genexpr>c                 s   s    | ]	}t t| V  qd S r(   )r5   reversedrH   r.   r.   r/   rJ      s    zAmbiguous kl_divergence(z, z). Please register_kl()   )
stacklevel)r$   NotImplementedminr6   warningswarnr@   RuntimeWarning)	r,   r-   matchesleft_pleft_qright_qright_pleft_fun	right_funr.   r+   r/   _dispatch_klq   s(   r[   c                 C   s   t | tS )zI
    Helper function for obtaining infinite KL Divergence throughout
    )torch	full_liker   tensorr.   r.   r/   _infinite_like   s   r`   c                 C   s   t j| | S )z2
    Utility function for calculating x log x
    )r\   specialxlogyr^   r.   r.   r/   _x_log_x   s   rc   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
    rM   N)sizereshapepowsumshape)bmatnrI   
flat_tracer.   r.   r/   _batch_trace_XXT   s   

rn   pqreturnc                 C   s   zt t| t|f }W n ty(   tt| t|}|t t| t|f< Y nw |tu r;t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%   r2   KeyErrorr[   rO   NotImplementedError	__class__r@   )ro   rp   r*   r.   r.   r/   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   )probsr\   nn
functionalsoftpluslogitsr   ro   rp   t1t2r.   r.   r/   _kl_bernoulli_bernoulli   s   r~   c           	      C   s   | j | j }|j |j }|j  |j  |  }| j  | j  |  }| j |j  t| j  }| j|j t| j }|| t| }|| | | | S r(   )concentration1concentration0lgammar\   digamma)	ro   rp   sum_params_psum_params_qr|   r}   t3t4t5r.   r.   r/   _kl_beta_beta   s   r   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anyrs   rv   rz   log1pr`   )ro   rp   klinf_idxsr.   r.   r/   _kl_binomial_binomial   s   (r   c                 C   sD   | j | j|j  }t||j dk|< d|| j dk|< |dS )Nr   rd   )rv   rz   r   	expand_asri   )ro   rp   tr.   r.   r/   _kl_categorical_categorical   s   
r   c                 C   sL   | j | j|j  }|  t| j  }|  t|j  }|| | S r(   )meanrz   _cont_bern_log_normr\   r   rv   ro   rp   r|   r}   r   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 )Nrd   )concentrationri   r   r   	unsqueeze)ro   rp   sum_p_concentrationsum_q_concentrationr|   r}   r   r   r.   r.   r/   _kl_dirichlet_dirichlet  s   r   c                 C   s"   |j | j  }|  }|| d S Nr   ratelog)ro   rp   
rate_ratior|   r.   r.   r/   _kl_exponential_exponential  s   
r   c                 C   s   t | t |urtddd | jD }|j}| j| }tjj| |dd}|j| | }t|||D ]\}}}	|| |	 }
|t	|
t
|j8 }q4|S )NzThe cross KL-divergence between different exponential families cannot                             be computed using Bregman divergencesc                 S   s   g | ]}|   qS r.   )detachrequires_grad_)rD   npr.   r.   r/   rG   !  s    z+_kl_expfamily_expfamily.<locals>.<listcomp>T)create_graph)r2   rs   _natural_params_log_normalizerr\   autogradgradri   r<   r"   lenevent_shape)ro   rp   	p_nparams	q_nparams	lg_normal	gradientsresultpnp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   r   r\   r   r   ro   rp   r|   r}   r   r   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locr   _euler_gammar\   expr   )ro   rp   ct1ct2ct3r|   r}   r   r.   r.   r/   _kl_gumbel_gumbel5  s   r   c                 C   s$   |    t|j | j  |j S r(   )entropyr\   r   rv   rz   ro   rp   r.   r.   r/   _kl_geometric_geometric@  s   $r   c                 C      t | j|jS r(   )_kl_normal_normal	base_distr   r.   r.   r/   _kl_halfnormal_halfnormalE     r   c                 C   sV   | j |j  }| j|j  }|  }||j  }|t| | j   }|| | d S r   )r   r   absr   r\   r   )ro   rp   scale_ratioloc_abs_diffr|   r}   r   r.   r.   r/   _kl_laplace_laplaceJ  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 computedre   Fupperrd         ?r   )r   
ValueErrorr   _unbroadcasted_cov_factor_unbroadcasted_cov_diag_capacitance_trilr   r   mTr   r\   linalgsolve_triangularri   rn   rsqrtsqrtmatmul)ro   rp   term1term3	qWt_qDinvAterm21term22term23term24term2r.   r.   r/   7_kl_lowrankmultivariatenormal_lowrankmultivariatenormalU  s6   
	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 )
NKL-divergence between two (Low Rank) Multivariate Normals with                          different event shapes cannot be computedrM   re   rd   dim1dim2Fr   r   r   )r   r   r   r   r   r   _unbroadcasted_scale_trildiagonalr   ri   r   r   r   r   r\   r   r   rn   r   r   )	ro   rp   r   r   r   r   r   r   r   r.   r.   r/   0_kl_multivariatenormal_lowrankmultivariatenormalw  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   rM   re   rd   r   r   Fr   r   )r   r   r   r   r   ri   r   r   r   r   r   r   r\   _C_infer_sizerj   expand
cov_factorrf   
diag_embedr   rn   r   r   )ro   rp   r   r   combined_batch_shaperl   q_scale_trilp_cov_factor
p_cov_diagr   r   r   r.   r.   r/   0_kl_lowrankmultivariatenormal_multivariatenormal  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 computedre   rd   r   r   Fr   r   )r   r   r   r   r   ri   r\   r   r   rj   r   rn   r   r   r   r   )	ro   rp   
half_term1r   rl   r   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 NrM   r   r   r   rh   r   r   )ro   rp   	var_ratior|   r.   r.   r/   r     s   r   c                 C   r   r(   )r   _categoricalr   r.   r.   r/   '_kl_onehotcategorical_onehotcategorical  r   r   c                 C   sX   | j |j  }|j| j }|j|  }|  }|| | d }t|| jj|jjk < |S r   )r   alphar   r   supportlower_bound)ro   rp   r   alpha_ratior|   r}   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     &r   c                 C   s.   | j |j krt| j|jkrtt| j|jS r(   )
transformsrs   r   r'   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lowr   r   ro   rp   r   r.   r.   r/   _kl_uniform_uniform  s   r  c                 C   s    |    | j|j  |j  S r(   )r   rv   r   r   r   r.   r.   r/   _kl_bernoulli_poisson  s    r  c                 C   s,   |    | j|j  t|j  |  S r(   )r   r   rz   r\   r   rv   r   r   r.   r.   r/   _kl_beta_continuous_bernoulli  s   
r	  c                 C   
   t | jS r(   )r`   r   r   r.   r.   r/   _kl_beta_infinity     
r  c                 C   s,   |    |j  |j| j| j| j    S r(   )r   r   r   r   r   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   r   r   r   r   r   r   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   )	r   r   r   rh   r   mathpir   r   )	ro   rp   E_beta
var_normalr|   r}   r   r   r   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  r   r   r   r   upper_boundr  r.   r.   r/   _kl_beta_uniform;  s    r  c                 C   r
  r(   )r`   rv   r   r.   r.   r/   !_kl_continuous_bernoulli_infinityE  r  r  c                 C   s"   |    t|j |j| j  S r(   )r   r\   r   r   r   r   r.   r.   r/   $_kl_continuous_bernoulli_exponentialJ  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  r   r  r\   squarer   r   variancer   r   r.   r.   r/   _kl_continuous_bernoulli_normalS  s   
( r  c              	   C   sV   |    |j|j   }ttt|j| jj	t
|j| jjt|t |S r(   )r   r  r  r   r\   wheremaxger   r   ler  	ones_liker   r  r.   r.   r/    _kl_continuous_bernoulli_uniform_  s   r   c                 C   r
  r(   r`   r   r   r.   r.   r/   _kl_exponential_infinityl     
r"  c                 C   sB   |j | j  }|j t| }|| |j  |jt  dt  S r   )r   r   r\   r   r   r   )ro   rp   ratior|   r.   r.   r/   _kl_exponential_gammat  s   r%  c                 C   sR   | j |j }|j|j }| d }t|| |d  }| }|| | | S r   )r   r   r   r   r\   r   
reciprocal)ro   rp   scale_rate_prodloc_scale_ratior|   r}   r   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   rh   r   r\   r   r  r  r&  r   )ro   rp   r  rate_sqrr|   r}   r   r   r.   r.   r/   _kl_exponential_normal  s   r+  c                 C   r
  r(   )r`   r   r   r.   r.   r/   _kl_gamma_infinity  r#  r,  c                 C   s&   |    |j  |j| j | j  S r(   )r   r   r   r   r   r.   r.   r/   _kl_gamma_exponential  r  r-  c                 C   s~   | j |j }|j|j }| jd | j  | j  | j }| | j|  }t|d|	  
| j  | }|| | S r   )r   r   r   r   r   r   r   r\   r   r&  rh   )ro   rp   beta_scale_prodr(  r|   r}   r   r.   r.   r/   _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   rh   r   r\   r   r  r  r   r   r   r   )ro   rp   r  beta_sqrr|   r}   r   r   r.   r.   r/   _kl_gamma_normal  s"   r1  c                 C   r
  r(   r`   r   r   r.   r.   r/   _kl_gumbel_infinity     
r3  c                 C   sx   | j |j  }|tdtj   }tj| d dd }| j| j t  |j |j  dd }| | | td  S )NrM   r      r   )r   r  r   r  r   rh   r   r   )ro   rp   param_ratior|   r}   r   r.   r.   r/   _kl_gumbel_normal  s
   &r7  c                 C   r
  r(   r2  r   r.   r.   r/   _kl_laplace_infinity  r4  r8  c                 C   s~   |j d}| j d| }dtd| tj  }d| jd }| j|j }d|jd }| | || | |  d S r   )r   rh   r\   r   r  r  r   )ro   rp   r  scale_sqr_var_ratior|   r}   r   r   r.   r.   r/   _kl_laplace_normal  s   r:  c                 C   r
  r(   r2  r   r.   r.   r/   _kl_normal_infinity  r4  r;  c                 C   s|   | j |j }| j|j d}|j |j }| d }|| }t| d|  | }| | | ddtdtj    S r   )r   r   rh   r   r\   r   r  r  )ro   rp   mean_scale_ratiovar_scale_sqr_ratior(  r|   r}   r   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 )NrM   g      r   r   )
r   r   r\   r   r  r   r  r   rh   erf)ro   rp   loc_diffr   loc_diff_scale_ratior|   r}   r   r.   r.   r/   _kl_normal_laplace  s   

(,rB  c                 C   r
  r(   )r`   r   r   r.   r.   r/   _kl_pareto_infinity  s   
rC  c                 C   sZ   | j |j }| j|  }| j }| j| | jd  }|| | d }t|| jdk< |S r   )r   r   r   r   r&  r   )ro   rp   r'  r|   r}   r   r   r.   r.   r/   _kl_pareto_exponential"  s   
rD  c                 C   s   | j  | j  }| j | }|j |j|j   }d|j | }|j| j | j  | jd  }|| | | d }t|| jdk< |S r   )r   r   r   r&  r   r   r   r   ro   rp   common_termr|   r}   r   r   r   r.   r.   r/   _kl_pareto_gamma-  s   rG  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 )NrM   r   )
r   rh   r   r  r   r  r   r&  r   r   )	ro   rp   r  rF  r|   r}   r   r   r   r.   r.   r/   _kl_pareto_normal<  s   &
rH  c                 C   r
  r(   r!  r   r.   r.   r/   _kl_poisson_infinityI  s   
rI  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  r\   r   r   rc   r   r   r   r   r  r   rE  r.   r.   r/   _kl_uniform_betaO  s.   
 rJ  c              	   C   sh   |    | j|j  t|j  |  }ttt	| j
|jjt| j|jjt|t |S r(   )r   r   rz   r\   r   rv   r   r  r  r  r  r   r  r  r  r   r  r   r  r.   r.   r/    _kl_uniform_continuous_bernoullig  s    
rK  c                 C   sB   |j | j| j  d | j| j |j    }t|| j|jjk < |S )NrM   )r   r  r  r   r   r   r   r  r.   r.   r/   _kl_uniform_exponetialy  s   ,rL  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   rM   )
r  r  r   r   r   r   rc   r   r   r   rE  r.   r.   r/   _kl_uniform_gamma  s   rM  c                 C   sn   |j | j| j  }| j|j |j  }| j|j |j  }| d||   }|t| t|   }|| S )Nr   )r   r  r  r   r   r\   r   )ro   rp   rF  high_loc_difflow_loc_diffr|   r}   r.   r.   r/   _kl_uniform_gumbel  s   rP  c                 C   st   | j | j }ttjd |j |  }|dd }| j | j d|j  d d}|d||  |jd  S )NrM      r   )	r  r  r  r   r  r   r   rh   r   )ro   rp   rF  r|   r}   r   r.   r.   r/   _kl_uniform_normal  s
    rR  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   rh   r   rc   r   r   r   )ro   rp   support_uniformr|   r}   r   r.   r.   r/   _kl_uniform_pareto  s   rT  c                 C   s*   | j |j krtt| j|j}t|| j S r(   )reinterpreted_batch_ndimsrs   r'   r   r"   r  r.   r.   r/   _kl_independent_independent  s   rV  c                 C   sD   | j |j  d| j|j d  }d| j  |j   }|| S )NrM      r   r{   r.   r.   r/   _kl_cauchy_cauchy  s   (rX  c                  C   sb   dg} t tdd dD ]\}}| d|j d|j d qd| }tjr/t j|7  _d	S 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 ru   )r@   )p_qr.   r.   r/   <lambda>  s    z_add_kl_info.<locals>.<lambda>)keyz* :class:`~torch.distributions.z#` and :class:`~torch.distributions.`z
	N)sortedr$   appendr@   joinr'   __doc__)rowsro   rp   kl_infor.   r.   r/   _add_kl_info  s   
rc  )r  rQ   collections.abcr   	functoolsr   r\   r   r   	bernoullir   betar   binomialr	   categoricalr
   cauchyr   continuous_bernoullir   	dirichletr   distributionr   
exp_familyr   exponentialr   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$   dicttupler2   __annotations__r%   __all__r&   r5   r[   r`   rc   rn   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/  r1  r3  r7  r8  r:  r;  r>  rB  rC  rD  rG  rH  rI  rJ  rK  rL  rM  rP  rR  rT  rV  rX  rc  r.   r.   r.   r/   <module>   s  
+
&















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

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

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