
    }Yh{              	           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# ZGe G d$ d%                      ZHd& ZId' ZJd( ZKd) ZLd*ed+ed,efd-ZM eGe
e
          d.             ZN eGee          d/             ZO eGee          d0             ZP eGee          d1             ZQ eGee          d2             ZR eGee          d3             ZS eGee          d4             ZT eGee          d5             ZU eGee          d6             ZV eGe"e"          d7             ZW eGe e           d8             ZX eGe$e$          d9             ZY eGe(e(          d:             ZZ eGe,e,          d;             Z[ eGe/e,          d<             Z\ eGe,e/          d=             Z] eGe/e/          d>             Z^ eGe1e1          d?             Z_ eGe3e3          d@             Z` eGe5e5          dA             Za eGe7e7          dB             Zb eGe9e9          dC             Zc eGe;e;          dD             Zd eGe
e7          dE             Ze eGee          dF             Zf eGee5          dG             Zg eGee          dH             Zh eGee          dI             Zi eGee1          dJ             Zj eGee;          dK             Zk eGee5          dL             Zl eGee          dM             Zm eGee1          dN             Zn eGee;          dO             Zo eGee           eGee           eGee5           eGee;          dP                                                 Zp eGee          dQ             Zq eGee"          dR             Zr eGee1          dS             Zs eGee           eGee           eGee5           eGee;          dT                                                 Zt eGee          dU             Zu eGee"          dV             Zv eGee1          dW             Zw eGe"e           eGe"e           eGe"e           eGe"e           eGe"e5           eGe"e;          dX                                                                         Zx eGe"e1          dY             Zy eGe(e           eGe(e           eGe(e           eGe(e           eGe(e5           eGe(e;          dZ                                                                         Zz eGe(e1          d[             Z{ eGe1e           eGe1e           eGe1e           eGe1e           eGe1e5           eGe1e;          d\                                                                         Z| eGe1e"          d]             Z} eGe1e(          d^             Z~ eGe5e           eGe5e           eGe5e;          d_                                     Z eGe5e          d`             Z eGe5e          da             Z eGe5e1          db             Z eGe7e
           eGe7e          dc                         Z eGe;e          dd             Z eGe;e          de             Z eGe;e          df             Z eGe;e          dg             Z eGe;e"          dh             Z eGe;e1          di             Z eGe;e5          dj             Z eGe&e&          dk             Z eGee          dl             Zdm ZdS )n    N)total_ordering)Callable)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                     t           t                    s't           t                    rt	          d            t          t                    s't          t                    rt	          d            f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                 R    | t           f<   t                                           | S N)r%   r&   clear)funtype_ptype_qs    h/var/www/tools.fuzzalab.pt/emblema-extractor/venv/lib/python3.11/site-packages/torch/distributions/kl.py	decoratorzregister_kl.<locals>.decoratorV   s(    '*VV^$
    )
isinstancetype
issubclassr   	TypeError)r.   r/   r1   s   `` r0   r'   r'   3   s    4 fd## 

6<(H(H 
MVMM
 
 	
 fd## 

6<(H(H 
MVMM
 
 	
     
 r2   c                   &    e Zd ZdgZd Zd Zd ZdS )_Matchtypesc                     || _         d S r+   r9   )selfr9   s     r0   __init__z_Match.__init__b   s    


r2   c                 "    | j         |j         k    S r+   r;   )r<   others     r0   __eq__z_Match.__eq__e   s    zU[((r2   c                 x    t          | j        |j                  D ]\  }}t          ||          s dS ||ur ndS )NFT)zipr9   r5   )r<   r?   xys       r0   __le__z_Match.__le__h   sT    
EK00 	 	DAqa## uuzz tr2   N)__name__
__module____qualname__	__slots__r=   r@   rE    r2   r0   r8   r8   ^   sH        	I  ) ) )    r2   r8   c                      fdt           D             }|st          S t          d |D                       j        \  }}t          d |D                       j        \  }}t           ||f         }t           ||f         }||ur;t	          j        d j         dj         d|j         d|j         d	t                     |S )zP
    Find the most specific approximate match, assuming single inheritance.
    c                 ^    g | ])\  }}t          |          t          |          %||f*S rJ   )r5   ).0super_psuper_qr.   r/   s      r0   
<listcomp>z _dispatch_kl.<locals>.<listcomp>u   sV       GWfg&& ,6fg+F+F	'  r2   c              3   (   K   | ]}t          | V  d S r+   )r8   rM   ms     r0   	<genexpr>z_dispatch_kl.<locals>.<genexpr>   s&      55555555r2   c              3   B   K   | ]}t          t          |           V  d S r+   )r8   reversedrR   s     r0   rT   z_dispatch_kl.<locals>.<genexpr>   s-      AAA68A;;/AAAAAAr2   zAmbiguous kl_divergence(z, z). Please register_kl())r%   NotImplementedminr9   warningswarnrF   RuntimeWarning)	r.   r/   matchesleft_pleft_qright_qright_pleft_fun	right_funs	   ``       r0   _dispatch_klrd   q   s        ,  G
   55W55555;NFFAAAAAAAGGWFFN+HWg-.Iy  Iv I I&/ I I"(/I I5<5EI I I	
 	
 	

 Or2   c                 6    t          j        | t                    S )zI
    Helper function for obtaining infinite KL Divergence throughout
    )torch	full_liker   tensors    r0   _infinite_likerj      s     ?63'''r2   c                 B    t           j                            | |           S )z2
    Utility function for calculating x log x
    )rf   specialxlogyrh   s    r0   _x_log_xrn      s     =vv...r2   c                    |                      d          }|                      d          }|                     d||z                                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nrS   
flat_traces       r0   _batch_trace_XXTr{      ss     			"A		"Ab!a%((,,Q//33B77Jdj"o...r2   pqreturnc                    	 t           t          |           t          |          f         }n`# t          $ rS t          t          |           t          |                    }|t           t          |           t          |          f<   Y nw xY 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&   r4   KeyErrorrd   rX   NotImplementedError	__class__rF   )r|   r}   r-   s      r0   r(   r(      s    &,$q''477*+ , , ,477DGG,,(+DGGT!WW$%%%, n!oq{7KooYZYdYmoo
 
 	
 3q!99s   ), AB	B	c                    | j         t          j        j                            |j                   t          j        j                            | j                   z
  z  }t          ||j         dk    <   d|| j         dk    <   d| j         z
  t          j        j                            |j                  t          j        j                            | j                  z
  z  }t          ||j         dk    <   d|| j         dk    <   ||z   S Nr   r   )probsrf   nn
functionalsoftpluslogitsr   r|   r}   t1t2s       r0   _kl_bernoulli_bernoullir      s    	
$$ahY//
(

&
&y
1
1	2
B Bqw!|Bqw!|
ag+$$QX..1D1M1Mah1W1WW
B Bqw!|Bqw!|7Nr2   c                 R   | j         | j        z   }|j         |j        z   }|j                                         |j                                        z   |                                z   }| j                                         | j                                        z   |                                z   }| j         |j         z
  t          j        | j                   z  }| j        |j        z
  t          j        | j                  z  }||z
  t          j        |          z  }||z
  |z   |z   |z   S r+   )concentration1concentration0lgammarf   digamma)	r|   r}   sum_params_psum_params_qr   r   t3t4t5s	            r0   _kl_beta_betar      s	   #a&66L#a&66L	
		 	 	"	"Q%5%<%<%>%>	>,AVAVAXAX	XB	
		 	 	"	"Q%5%<%<%>%>	>,AVAVAXAX	XB

Q-
-q?O1P1P	PB

Q-
-q?O1P1P	PB

%|)D)D	DB7R<"r!!r2   c                 b   | j         |j         k                                     rt          d          | j         | j        | j        |j        z
  z  | j                                         z   |j                                         z
  z  }| j         |j         k    }t          ||                   ||<   |S )NzKKL between Binomials where q.total_count > p.total_count is not implemented)total_countanyr   r   r   log1prj   )r|   r}   klinf_idxss       r0   _kl_binomial_binomialr      s     	
%**,, 
!Y
 
 	
 
	18ah&'AG8*:*:*<*<<?O?O?Q?QQ
B }q},H!"X,//BxLIr2   c                     | j         | j        |j        z
  z  }t          ||j         dk                        |          <   d|| j         dk                        |          <   |                    d          S )Nr   rp   )r   r   r   	expand_asrv   )r|   r}   ts      r0   _kl_categorical_categoricalr      sc    	18ah&'A%(Aqw!|q!!"%&Aqw!|q!!"5599r2   c                     | j         | j        |j        z
  z  }|                                 t          j        | j                   z   }|                                 t          j        |j                   z
  }||z   |z   S r+   )meanr   _cont_bern_log_normrf   r   r   r|   r}   r   r   r   s        r0   -_kl_continuous_bernoulli_continuous_bernoullir      sp    	
18ah&	'B	
			 	 5;x#8#8	8B



!
!	!EK$9$9	9B7R<r2   c                 $   | j                             d          }|j                             d          }|                                |                                z
  }| j                                         |j                                         z
                      d          }| j         |j         z
  }| j                                         |                                                    d          z
  }||z
  ||z                      d          z   S )Nrp   )concentrationrv   r   r   	unsqueeze)r|   r}   sum_p_concentrationsum_q_concentrationr   r   r   r   s           r0   _kl_dirichlet_dirichletr     s     /--b11/--b11		#	#	%	%(;(B(B(D(D	DB
/
 
 
"
"Q_%;%;%=%=
=	B	B2	F	FB	
1?	*B	
	 	 	"	"%8%@%@%B%B%L%LR%P%P	PB7b2g]]2&&&&r2   c                 Z    |j         | j         z  }|                                 }||z   dz
  S Nr   ratelog)r|   r}   
rate_ratior   s       r0   _kl_exponential_exponentialr     s0    !&J
..

	B
?Qr2   c                    t          |           t          |          k    st          d          d | j        D             }|j        } | j        | }t          j                            |                                |d          } |j        | |z
  }t          |||          D ]3\  }}}	||z
  |	z  }
|t          |
t          |j                            z  }4|S )NzThe cross KL-divergence between different exponential families cannot                             be computed using Bregman divergencesc                 Z    g | ](}|                                                                 )S rJ   )detachrequires_grad_)rM   nps     r0   rP   z+_kl_expfamily_expfamily.<locals>.<listcomp>   s,    JJJ"++--JJJr2   T)create_graph)r4   r   _natural_params_log_normalizerrf   autogradgradrv   rB   r#   lenevent_shape)r|   r}   	p_nparams	q_nparams	lg_normal	gradientsresultpnpqnpgterms              r0   _kl_expfamily_expfamilyr     s    77d1gg!C
 
 	
 KJ8IJJJI!I!!9-I##IMMOOYT#RRIQ	*Y6F9i;; ; ;S!c	Q.s1='9'9:::Mr2   c                 `   |j         | j        |j        z                                  z  }t          j        |j                   t          j        | j                   z
  }| j         |j         z
  t          j        | j                   z  }|j        | j        z
  | j         | j        z  z  }||z   |z   |z   S r+   )r   r   r   rf   r   r   r|   r}   r   r   r   r   s         r0   _kl_gamma_gammar   +  s    	
AFQVO0022	2B	ao	&	&ao)F)F	FB
/AO
+u}Q_/M/M	MB
&16/ao6	7B7R<"r2   c                 *   | j         |j         z  }|j        |j         z  }| j        |j         z  }|                                 |z
  |z   }|t          z  }t	          j        |d|z                                   z   |z
            }||z   |z   dt          z   z
  S r   )scalelocr   _euler_gammarf   expr   )r|   r}   ct1ct2ct3r   r   r   s           r0   _kl_gumbel_gumbelr   4  s    
'AG
C
%!'/C
%!'/C
''))c	C	B	|	B	3!c'))+++c1	2	2B7R<1|+,,r2   c                     |                                   t          j        |j                   | j        z  z
  |j        z
  S r+   )entropyrf   r   r   r   r|   r}   s     r0   _kl_geometric_geometricr   ?  s3    IIKK<%+qwh//!'99AHDDr2   c                 6    t          | j        |j                  S r+   )_kl_normal_normal	base_distr   s     r0   _kl_halfnormal_halfnormalr   D  s    Q[!+666r2   c                     | j         |j         z  }| j        |j        z
                                  }|                                 }||j         z  }|t	          j        | | j         z            z  }||z   |z   dz
  S r   )r   r   absr   rf   r   )r|   r}   scale_ratioloc_abs_diffr   r   r   s          r0   _kl_laplace_laplacer   I  sy     'AG#KEAEM&&((L
//

	B		B	uy,!899	9B7R<!r2   c                    | j         |j         k    rt          d          t          |j        |j        |j                  t          | j        | j        | j                  z
  }t          |j        |j        |j        | j        z
  |j                  }|j        j        |j        	                    d          z  }t          j                            |j        |d          }| j        |j        z                      d          }t          | j        |j                                        	                    d          z            }t          || j                                        	                    d          z            }t          |                    | j                            }	||z   |z
  |	z
  }
d||
z   |z   | j         d         z
  z  S )NzKL-divergence between two Low Rank Multivariate Normals with                          different event shapes cannot be computedrq   Fupperrp         ?r   )r   
ValueErrorr   _unbroadcasted_cov_factor_unbroadcasted_cov_diag_capacitance_trilr   r   mTr   rf   linalgsolve_triangularrv   r{   rsqrtsqrtmatmul)r|   r}   term1term3	qWt_qDinvAterm21term22term23term24term2s              r0   7_kl_lowrankmultivariatenormal_lowrankmultivariatenormalr   T  s   }%%E
 
 	

 "	#Q%>@S 	#Q%>@S	 	E
 '	#	!			 E +.1J1T1TUW1X1XXI%%a&99E%RRA'!*CCHHLLF	#a&?&E&E&G&G&Q&QRT&U&UU F a!";"@"@"B"B"L"LR"P"PPQQFahhq'BCCDDFVOf$v-E%%-%'!-*::;;r2   c                    | j         |j         k    rt          d          t          |j        |j        |j                  d| j                            dd                                          	                    d          z  z
  }t          |j        |j        |j        | j        z
  |j                  }|j        j        |j                            d          z  }t          j                            |j        |d          }t#          | j        |j                                                            d          z            }t#          |                    | j                            }||z
  }d||z   |z   | j         d	         z
  z  S )
NKL-divergence between two (Low Rank) Multivariate Normals with                          different event shapes cannot be computedrr   rq   rp   dim1dim2Fr   r   r   )r   r   r   r   r   r   _unbroadcasted_scale_trildiagonalr   rv   r   r   r   r   rf   r   r   r{   r   r   )	r|   r}   r   r   r   r   r   r   r   s	            r0   0_kl_multivariatenormal_lowrankmultivariatenormalr  v  sx   }%%E
 
 	

 "	#Q%>@S 	A'00br0BBFFHHLLRPPPQE '	#	!			 E +.1J1T1TUW1X1XXI%%a&99E%RRA	#a&?&E&E&G&G&Q&QRT&U&UU F ahhq'BCCDDFVOE%%-%'!-*::;;r2   c                    | j         |j         k    rt          d          d|j                            dd                                                              d          z  t          | j        | j        | j	                  z
  }t          |j        |j        | j        z
            }t          j                            |j        j        d d         | j        j        d d                   }| j         d         }|j                            |||fz             }| j                            ||| j                            d          fz             }t          j        | j                                                                      |||fz             }t+          t          j                            ||d                    }	t+          t          j                            ||d                    }
|	|
z   }d	||z   |z   | j         d         z
  z  S )
Nr   rr   rq   rp   r   r   Fr   r   )r   r   r  r  r   rv   r   r   r   r   r   r   rf   _C_infer_sizerw   expand
cov_factorrs   
diag_embedr   r{   r   r   )r|   r}   r   r   combined_batch_shapery   q_scale_trilp_cov_factor
p_cov_diagr   r   r   s               r0   0_kl_lowrankmultivariatenormal_multivariatenormalr    s   }%%E
 
 	

 +44"24FFJJLLPP
  	#Q%>@S	 	E
 q:QUQU]LLE !8//	#)#2#.0K0QRUSURU0V  	
aA.556JaQRV6STTL.551<#4#4R#8#899 L !!";"@"@"B"BCCJJ1v% J %%lL%NN F %%lJe%LL F VOE%%-%'!-*::;;r2   c                 "   | j         |j         k    rt          d          |j                            dd                                                              d          | j                            dd                                                              d          z
  }t          j                            |j        j	        d d         | j        j	        d d                   }| j         d         }|j        
                    |||fz             }| j        
                    |||fz             }t          t          j                            ||d                    }t          |j        |j        | j        z
            }|d||z   |z
  z  z   S )	NzvKL-divergence between two Multivariate Normals with                          different event shapes cannot be computedrq   rp   r   r   Fr   r   )r   r   r  r  r   rv   rf   r  r  rw   r  r{   r   r   r   r   )	r|   r}   
half_term1r  ry   r  p_scale_trilr   r   s	            r0   )_kl_multivariatenormal_multivariatenormalr    s    	}%%E
 
 	

 ,552B5GGKKMMQQ
 	#,,"2,>>BBDDHHLLMJ !8//	#)#2#.0K0QRUSURU0V  	
aA.556JaQRV6STTL.556JaQRV6STTL%%lL%NN E q:QUQU]LLEuu}q0111r2   c                     | j         |j         z                      d          }| j        |j        z
  |j         z                      d          }d||z   dz
  |                                z
  z  S Nrr   r   r   r   ru   r   r   )r|   r}   	var_ratior   s       r0   r   r     sa    17"''**I515=AG
#	(	(	+	+B)b.1$y}}677r2   c                 6    t          | j        |j                  S r+   )r   _categoricalr   s     r0   '_kl_onehotcategorical_onehotcategoricalr    s    &q~q~FFFr2   c                     | j         |j         z  }|j        | j        z  }|j        |                                z  }|                                 }||z   |z   dz
  }t          || j        j        |j        j        k     <   |S r   )r   alphar   r   supportlower_bound)r|   r}   r   alpha_ratior   r   r   s          r0   _kl_pareto_paretor     sy     'AG#K'AG#K	
;??$$	$B
//

	B"W{"Q&F<?F19 19#889Mr2   c                     | j         | j                                         |j                                         z
  z  | j         |j         z
  z
  S r+   r   r   s     r0   _kl_poisson_poissonr"    s5    6QVZZ\\AFJJLL01QVaf_EEr2   c                     | j         |j         k    rt          | j        |j        k    rt          t          | j        |j                  S r+   )
transformsr   r   r(   r   r   s     r0   _kl_transformed_transformedr%    s@    |q|##!!}%%!!ak222r2   c                     |j         |j        z
  | j         | j        z
  z                                  }t          ||j        | j        k    |j         | j         k     z  <   |S r+   )highlowr   r   r|   r}   r   s      r0   _kl_uniform_uniformr*    sL    v~!&15.16688F25FAEAEMafqvo./Mr2   c                     |                                   | j        |j                                        z  |j        z
  z
  S r+   )r   r   r   r   r   s     r0   _kl_bernoulli_poissonr,     s/    IIKK<17QVZZ\\1AF:;;r2   c                     |                                   | j        |j        z  z
  t          j        |j                   z
  |                                z
  S r+   )r   r   r   rf   r   r   r   r   s     r0   _kl_beta_continuous_bernoullir.    sS     

&18
	
+qwh

	  


!
!	"r2   c                 *    t          | j                  S r+   )rj   r   r   s     r0   _kl_beta_infinityr0    s    !*+++r2   c                     |                                   |j                                        z
  |j        | j        | j        | j        z   z  z  z   S r+   )r   r   r   r   r   r   s     r0   _kl_beta_exponentialr2    sK     

&**,,	
&A$(81;K(KL
M	Nr2   c                    |                                   }|j                                        |j        |j                                        z  z
  }|j        dz
  | j                                        | j        | j        z                                   z
  z  }|j        | j        z  | j        | j        z   z  }||z   |z
  |z   S r   )r   r   r   r   r   r   r   r   r   s         r0   _kl_beta_gammar4    s    
))++B	
			!	!AOafjjll$B	BB
/A
	  ""a&69I&I%R%R%T%TT
B 
!"	"a&69I&I	JB7R<"r2   c                    | j         | j         | j        z   z  }|j                            d          }|                                  }d|dz  t
          j        z                                  z  }|d|z
  z  | j         | j        z   dz   z  |                    d          z   dz  }|j        |z  }|j                            d          dz  }||z   ||z
  |z   |z  z   S r  )	r   r   r   ru   r   mathpir   r   )	r|   r}   E_beta
var_normalr   r   r   r   r   s	            r0   _kl_beta_normalr:  +  s    !1A4D!DEFQJ
))++B	
Q(--//	/B!f*!1A4D!Dq!HI
**Q--	
B 
B	
1	B7b2glj000r2   c                     |                                   |j        |j        z
                                  z   }t          ||j        | j        j        k    |j        | j        j        k     z  <   |S r+   )r   r'  r(  r   r   r  r  upper_boundr)  s      r0   _kl_beta_uniformr=  :  sV    iikk\QVae^00222FQTFAEAI))afqy7L.LMNMr2   c                 *    t          | j                  S r+   )rj   r   r   s     r0   !_kl_continuous_bernoulli_infinityr?  D  s    !'"""r2   c                     |                                   t          j        |j                  z
  |j        | j        z  z   S r+   )r   rf   r   r   r   r   s     r0   $_kl_continuous_bernoulli_exponentialrA  I  s0    IIKK<%)AF+++afqvo==r2   c                    |                                   }dt          j        dt          j        z            t	          j        |j        |j        z            z   z  t	          j        |j                  z   }| j        t	          j        | j	                  z   d|j        z  | j	        z  z
  dt	          j        |j                  z  z  }||z   |z   S )Nr   g       @)
r   r6  r   r7  rf   squarer   r   variancer   r   s        r0   _kl_continuous_bernoulli_normalrE  R  s    
))++B	tw''%,quqw*G*GG	H59	L L 
B *u|AF++
+cAEkAF.B
Bel17###
B 7R<r2   c           	      ~   |                                   |j        |j        z
                                  z   }t	          j        t	          j        t	          j        |j        | j        j	                  t	          j
        |j        | j        j                            t	          j        |          t          z  |          S r+   )r   r'  r(  r   rf   wheremaxger  r  ler<  	ones_liker   r)  s      r0    _kl_continuous_bernoulli_uniformrL  ^  s    iikk\QVae^00222F;	HQUAI122HQVQY233	
 	
 	#%  r2   c                 *    t          | j                  S r+   rj   r   r   s     r0   _kl_exponential_infinityrO  k  s    
 !&!!!r2   c                     |j         | j         z  }|j         t          j        |          z  }||z   |j                                        z   |j        t
          z  z   dt
          z   z
  S r   )r   r   rf   r   r   r   )r|   r}   ratior   s       r0   _kl_exponential_gammarR  s  sn    FQVOE
/	EIe,,	,B

	
/
 
 
"
"	# /L
(	) |		r2   c                     | j         |j        z  }|j        |j        z  }|                                dz
  }t	          j        |          |z  |dz   z  }|                                }||z
  |z   |z   S r   )r   r   r   r   rf   r   
reciprocal)r|   r}   scale_rate_prodloc_scale_ratior   r   r   s          r0   _kl_exponential_gumbelrW    sw    fqw&OeagoO						"B	?	#	#o	519L	MB		#	#	%	%B"$r))r2   c                 `   |j                             d          }| j                            d          }dt          j        ||z  dz  t
          j        z            z  }|                                }|j        | j        z  }|j                            d          dz  }|dz
  ||z
  |z   |z  z   S r  )	r   ru   r   rf   r   r6  r7  rT  r   )r|   r}   r9  rate_sqrr   r   r   r   s           r0   _kl_exponential_normalrZ    s    QJvzz!}}H	uyJ.2TW<==	=B					B	
B	
1	B6R"Wr\Z///r2   c                 *    t          | j                  S r+   )rj   r   r   s     r0   _kl_gamma_infinityr\    s    
 !/***r2   c                     |                                   |j                                        z
  |j        | j        z  | j        z  z   S r+   )r   r   r   r   r   s     r0   _kl_gamma_exponentialr^    s6    IIKK<!&**,,&!/)AAF)JJJr2   c                    | j         |j        z  }|j        |j        z  }| j        dz
  | j                                        z  | j                                        z
  | j        z
  }|                                | j        |z  z   }t          j        |          d|	                                z   
                    | j                   z  |z
  }||z   |z   S r   )r   r   r   r   r   r   r   rf   r   rT  ru   )r|   r}   beta_scale_prodrV  r   r   r   s          r0   _kl_gamma_gumbelra    s    fqw&OeagoO	
1	 7 7 9 99
/
 
 
"
"	#
/	 
 
				?!B	BB	/""))+++
0
0!/1A
B
B	C
	 
 7R<r2   c                     |j                             d          }| j                            d          }dt          j        ||z  dz  t
          j        z            z  | j        z
  | j                                        z
  }d| j                            d          | j        z   z  |z  }|j	        | j        z  | j        z  }d|j	                            d          z  }|| j        dz
  | j        
                                z  z   ||z
  |z   |z  z   S r  )r   ru   r   rf   r   r6  r7  r   r   r   r   )r|   r}   r9  beta_sqrr   r   r   r   s           r0   _kl_gamma_normalrd    s    QJvzz!}}Hei:-1DG;<<<
/	
/
 
 
"
"	# 
 
##A&&8	9H	DB	
	 16	)B	quyy||	B
?Q!/"9"9";";
;	<7R<:
%	&r2   c                 *    t          | j                  S r+   rj   r   r   s     r0   _kl_gumbel_infinityrg         !%   r2   c                 ~   | j         |j         z  }|t          j        dt          j        z            z                                  }t          j        |z  dz                      d          dz  }| j        | j         t          z  z   |j        z
  |j         z                      d          dz  }| |z   |z   t          dz   z
  S )Nrr   r      r   )r   r6  r   r7  r   ru   r   r   )r|   r}   param_ratior   r   r   s         r0   _kl_gumbel_normalrl    s    'AG#K
	!dg+..
.	3	3	5	5B
'K
#
%	*	*1	-	-	1B517\))AE1QW
<	A	A!	D	Ds	JB38b=L1,--r2   c                 *    t          | j                  S r+   rf  r   s     r0   _kl_laplace_infinityrn    rh  r2   c                 z   |j                             d          }| j                             d          |z  }dt          j        d|z  t          j        z            z  }d| j                            d          z  }| j        |j        z  }d|j                            d          z  }| |z   ||z
  |z   |z  z   dz
  S r  )r   ru   rf   r   r6  r7  r   )r|   r}   r9  scale_sqr_var_ratior   r   r   r   s           r0   _kl_laplace_normalrq    s    QJ'++a..:5	uy0047:;;	;B	quyy||	B	
B	quyy||	B3$$R"
'BBQFFr2   c                 *    t          | j                  S r+   rf  r   s     r0   _kl_normal_infinityrs    rh  r2   c                 X   | j         |j        z  }| j        |j        z                      d          }|j         |j        z  }|                                dz  }||z
  }t	          j        | d|z  z   |z             }| |z   |z   ddt          j        dt          j        z            z   z  z
  S r  )r   r   ru   r   rf   r   r6  r7  )r|   r}   mean_scale_ratiovar_scale_sqr_ratiorV  r   r   r   s           r0   _kl_normal_gumbelrw    s    uqw7QW,11!44eagoO		 	 	"	"S	(B	O	+B	$$s-@'@@?R	S	SB38b=C1txDG'<'<#<=>>r2   c                    | j         |j         z
  }| j        |j        z  }|| j        z  }t          j        |          }t	          j        dt          j        z            | j        z  t          j        d|                    d          z            z  }|t          j	        t	          j        d          |z            z  }| ||z   |j        z  z   ddt	          j        dt          j        z            z   z  z
  S )Nrr   g      r   r   )
r   r   rf   r   r6  r   r7  r   ru   erf)r|   r}   loc_diffr   loc_diff_scale_ratior   r   r   s           r0   _kl_normal_laplacer|    s    uqu}H'AG#K#ag-	;		B	!dg+(59T<P<T<TUV<W<W5W+X+XX  
EIdinn/CCDD	DB3"r'QW$$q48C$'M3J3J/J(KLLr2   c                 *    t          | j                  S r+   )rj   r   r   s     r0   _kl_pareto_infinityr~    s     !'"""r2   c                     | j         |j        z  }| j        |z                                  }| j                                        }| j        |z  | j        dz
  z  }||z
  |z   dz
  }t
          || j        dk    <   |S r   )r   r   r  r   rT  r   )r|   r}   rU  r   r   r   r   s          r0   _kl_pareto_exponentialr  !  sy    g&O
'O
#	(	(	*	*B	
				B	
?	"agk	2B"Wr\AFF17a<Mr2   c                    | j                                         | j                                        z   }| j                                        |z
  }|j                                        |j        |j                                        z  z
  }d|j        z
  |z  }|j        | j        z  | j         z  | j        dz
  z  }||z   |z   |z   dz
  }t          || j        dk    <   |S r   )r   r   r  rT  r   r   r   r   r|   r}   common_termr   r   r   r   r   s           r0   _kl_pareto_gammar  ,  s    '++--!'"4"4"6"66K	
	$B	
			!	!AOafjjll$B	BB
ao
	,B	
!'	AG	#qw{	3B"Wr\B"FF17a<Mr2   c                    d|j                             d          z  }| j         | j        dz
  z  }t          j        dt          j        z            |j         z  | j        z  | j         z                                  }| j                                        }| j        |                    d          z  | j        dz
  z  }| j        |z  |j        z
                      d          }||z
  ||z   |z  z   dz
  }t          || j        dk    <   |S )Nrr   r   )
r   ru   r  r6  r   r7  r   rT  r   r   )	r|   r}   r9  r  r   r   r   r   r   s	            r0   _kl_pareto_normalr  ;  s    QW[[^^#J'QWq[)K
)AK
 
 17
*QW
4qw
>	C	C	E	EB	
				B	
;??1%%	%1	5B
'K
!%
'	,	,Q	/	/B"WR:--1FF17a<Mr2   c                 *    t          | j                  S r+   rN  r   s     r0   _kl_poisson_infinityr  H  s     !&!!!r2   c                 f   | j         | j        z
  }t          j        |          }|j        dz
  t          | j                   t          | j                  z
  |z
  z  |z  }|j        dz
  t          d| j         z
            t          d| j        z
            z
  |z   z  |z  }|j                                        |j                                        z   |j        |j        z                                   z
  }||z   |z
  |z
  }t          || j         |j	        j
        k    | j        |j	        j        k     z  <   |S r   )r'  r(  rf   r   r   rn   r   r   r   r  r<  r  r  s           r0   _kl_uniform_betar  N  s2   &15.K	;		B	
	A	AFhquoo-;	=
	  
	A	AJ(1qu9"5"55C	E
	  	
!!


!
!
#
#	$a..
6
6
8
8	9 
 "Wr\BFQTFAFQY**quqy7L/LMNMr2   c           	         |                                   | j        |j        z  z
  t          j        |j                   z
  |                                z
  }t          j        t          j        t          j	        | j
        |j        j                  t          j        | j        |j        j                            t          j        |          t"          z  |          S r+   )r   r   r   rf   r   r   r   rG  rH  rI  r'  r  r<  rJ  r(  r  rK  r   r)  s      r0    _kl_uniform_continuous_bernoullir  f  s     

&18
	
+qwh

	  


!
!	"  ;	HQVQY233HQUAI122	
 	
 	#%  r2   c                     |j         | j        | j        z   z  dz  | j        | j        z
  |j         z                                  z
  }t          || j        |j        j        k     <   |S )Nrr   )r   r'  r(  r   r   r  r  r)  s      r0   _kl_uniform_exponetialr  x  sV    Vqv~&*qv~.G-L-L-N-NNF,/F1519(()Mr2   c                    | j         | j        z
  }|                                }|j                                        |j        |j                                        z  z
  }d|j        z
  t          | j                   t          | j                  z
  |z
  z  |z  }|j        | j         | j        z   z  dz  }| |z   |z   |z   }t          || j        |j        j	        k     <   |S )Nr   rr   )
r'  r(  r   r   r   r   rn   r   r  r  r  s           r0   _kl_uniform_gammar    s    &15.K			B	
			!	!AOafjjll$B	BB	
Q_	AFhquoo-;	=
	 
 
16AE>	"Q	&BS2X]RF,/F1519(()Mr2   c                 ,   |j         | j        | j        z
  z  }| j        |j        z
  |j         z  }| j        |j        z
  |j         z  }|                                d||z   z  z   }|t          j        |           t          j        |           z
  z  }||z
  S )Nr   )r   r'  r(  r   r   rf   r   )r|   r}   r  high_loc_difflow_loc_diffr   r   s          r0   _kl_uniform_gumbelr    s    'QVae^,KVae^qw.MEAEMQW,L			SML$@A	AB		=.11EI|m4L4LL	MB7Nr2   c                 x   | j         | j        z
  }t          j        t          j        dz            |j        z  |z                                  }|                    d          dz  }| j         | j        z   d|j        z  z
  dz                      d          }|d||z   z  |j                            d          z  z   S )Nrr      r   )	r'  r(  r6  r   r7  r   r   ru   r   )r|   r}   r  r   r   r   s         r0   _kl_uniform_normalr    s    &15.K
)DGaK
 
 17
*[
8	=	=	?	?B
		1			"B6AE>AI%
*	/	/	2	2BrBw!'++a..000r2   c                 T   | j         | j        z
  }|j        |j                            |j                  z  |z                                  }t          | j                   t          | j                  z
  |z
  |z  }||j        dz   z  |z
  }t          || j        |j        j	        k     <   |S r   )
r'  r(  r  r   ru   r   rn   r   r  r  )r|   r}   support_uniformr   r   r   s         r0   _kl_uniform_paretor    s    fqunO
'AGKK((
(O
<	A	A	C	CB
16

Xae__
,
>/	QB17Q;"$F,/F1519(()Mr2   c                     | j         |j         k    rt          t          | j        |j                  }t	          || j                   S r+   )reinterpreted_batch_ndimsr   r(   r   r#   r)  s      r0   _kl_independent_independentr    s?    "a&AAA!!1;44F&!"=>>>r2   c                    | j         |j         z                       d          | j        |j        z
                      d          z                                   }d| j         z  |j         z                                  }||z
  S )Nrr      r  r   s       r0   _kl_cauchy_cauchyr    sn     7QW
!
!!
$
$':':1'='=
=	B	B	D	DB
ag+
	$	$	&	&B7Nr2   c                     dg} t          t          d           D ]+\  }}|                     d|j         d|j         d           ,d                    |           }t
          j        rt
          xj        |z  c_        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                 6    | d         j         | d         j         fS r   )rF   )p_qs    r0   <lambda>z_add_kl_info.<locals>.<lambda>  s    s1vA&H r2   )keyz* :class:`~torch.distributions.z#` and :class:`~torch.distributions.`z
	N)sortedr%   appendrF   joinr(   __doc__)rowsr|   r}   kl_infos       r0   _add_kl_infor    s     	WD HH   
 
1 	jajjj]^]gjjj	
 	
 	
 	
 kk$G )() )r2   )r6  rZ   	functoolsr   typingr   rf   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tupler4   __annotations__r&   __all__r'   r8   rd   rj   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.  r0  r2  r4  r:  r=  r?  rA  rE  rL  rO  rR  rW  rZ  r\  r^  ra  rd  rg  rl  rn  rq  rs  rw  r|  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rJ   r2   r0   <module>r     s     $ $ $ $ $ $                                        $ $ $ $ $ $       5 5 5 5 5 5             & & & & & & ) ) ) ) ) ) $ $ $ $ $ $                         # # # # # # $ $ $ $ $ $               
 H G G G G G G G       2 2 2 2 2 2             = = = = = =       A A A A A A A A
  d	$*x   
  T	$*x    /
*( ( (V        $  6( ( (/ / // / /\ l v    L Y	""  #" T4" " " Xx    !  [+&&  '&  "566  76 Y	""' ' #"' [+&&  '&  122  32" UE   VV- - - Y	""E E #"E Z$$7 7 %$7 Wg   &(ABB< < CB<B !:;;< < <;<: &(:;;!< !< <;!<H !3442 2 5420 VV8 8 8  122G G 32G VV   WgF F F $&=>>3 3 ?>3 Wg   Y  < < ! < T&''  (' T6, , , T;    T5   T61 1 1 T7    &))# # *)#  +..> > /.>  &))  *)  '**	 	 +*	 [$[-..[&!!['""" " #" "! /.  " [%  	 	 ! 	 [&!!* * "!* [&!!0 0 "!0 UDU'((UFUG+ +   )( + UK  K K ! K UF  ( UF  $ VTV())V[!!VUVVVW! !    "! *) ! VV. . . WdW)**Wk""WeWfWg! !    #" +* ! WfG G G VTV())V[!!VUVVVW! !    "! *) ! VV? ? ? VW	M 	M 	M VTV())VW# #  *) # V[!!  "! VU   VV	 	 	 Wi  Wh" "   ! " Wd  . W)**  +*" Wk""  #" We   Wf   Wf1 1 1 Wf   [+&&? ? '&? VV  ) ) ) ) )r2   