
    sg{              	          U d dl Z d dlZd dlmZ d dlmZmZmZmZ d dl	Z	d dl	m
Z
 ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z,m-Z-m.Z. ddl/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9Z9 ddl:m;Z; ddl<m=Z= ddl>m?Z?m@ZA i ZBeeeef   ef   eCd<   i ZDeeeef   ef   eCd <   d!d"gZEd# ZFe G d$ d%             ZGd& ZHd' ZId( ZJd) ZKd*ed+ed,e	j                  fd-ZM eFee      d.        ZN eFee      d/        ZO eFee      d0        ZP eFee      d1        ZQ eFee      d2        ZR eFee      d3        ZS eFee      d4        ZT eFee      d5        ZU eFe e       d6        ZV eFe$e$      d7        ZW eFe"e"      d8        ZX eFe&e&      d9        ZY eFe*e*      d:        ZZ eFe.e.      d;        Z[ eFe1e.      d<        Z\ eFe.e1      d=        Z] eFe1e1      d>        Z^ eFe3e3      d?        Z_ eFe5e5      d@        Z` eFe7e7      dA        Za eFe9e9      dB        Zb eFe;e;      dC        Zc eFe=e=      dD        Zd eFee9      dE        Ze eFee      dF        Zf eFee7      dG        Zg eFee      dH        Zh eFee       dI        Zi eFee3      dJ        Zj eFee=      dK        Zk eFee7      dL        Zl eFee      dM        Zm eFee3      dN        Zn eFee=      dO        Zo eFee       eFee       eFee7       eFee=      dP                             Zp eFee       dQ        Zq eFee$      dR        Zr eFee3      dS        Zs eFe e       eFe e       eFe e7       eFe e=      dT                             Zt eFe e      dU        Zu eFe e$      dV        Zv eFe e3      dW        Zw eFe$e       eFe$e       eFe$e       eFe$e        eFe$e7       eFe$e=      dX                                           Zx eFe$e3      dY        Zy eFe*e       eFe*e       eFe*e       eFe*e        eFe*e7       eFe*e=      dZ                                           Zz eFe*e3      d[        Z{ eFe3e       eFe3e       eFe3e       eFe3e        eFe3e7       eFe3e=      d\                                           Z| eFe3e$      d]        Z} eFe3e*      d^        Z~ eFe7e       eFe7e       eFe7e=      d_                      Z eFe7e      d`        Z eFe7e       da        Z eFe7e3      db        Z eFe9e       eFe9e      dc               Z eFe=e      dd        Z eFe=e      de        Z eFe=e      df        Z eFe=e       dg        Z eFe=e$      dh        Z eFe=e3      di        Z eFe=e7      dj        Z eFe(e(      dk        Z eFee      dl        Zdm Zy)n    N)total_ordering)CallableDictTupleType)inf   )	Bernoulli)Beta)Binomial)Categorical)Cauchy)ContinuousBernoulli)	Dirichlet)Distribution)ExponentialFamily)Exponential)Gamma)	Geometric)Gumbel)
HalfNormal)Independent)Laplace)_batch_lowrank_logdet_batch_lowrank_mahalanobisLowRankMultivariateNormal)_batch_mahalanobisMultivariateNormal)Normal)OneHotCategorical)Pareto)Poisson)TransformedDistribution)Uniform)_sum_rightmosteuler_constant_KL_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                 F    | t         f<   t        j                          | S N)r'   r(   clear)funtype_ptype_qs    I/var/www/html/venv/lib/python3.12/site-packages/torch/distributions/kl.py	decoratorzregister_kl.<locals>.decoratorV   s"    '*VV^$
    )
isinstancetype
issubclassr   	TypeError)r0   r1   r3   s   `` r2   r)   r)   3   sh    4 fd#
6<(HDVHM
 	
 fd#
6<(HDVHM
 	

 r4   c                   $    e Zd ZdgZd Zd Zd Zy)_Matchtypesc                     || _         y r-   r;   )selfr;   s     r2   __init__z_Match.__init__b   s	    
r4   c                 4    | j                   |j                   k(  S r-   r=   )r>   others     r2   __eq__z_Match.__eq__e   s    zzU[[((r4   c                 |    t        | j                  |j                        D ]  \  }}t        ||      s y||us y y)NFT)zipr;   r7   )r>   rA   xys       r2   __le__z_Match.__le__h   sC    

EKK0 	DAqa#z	
 r4   N)__name__
__module____qualname__	__slots__r?   rB   rG    r4   r2   r:   r:   ^   s    	I)r4   r:   c                    t         D cg c]!  \  }}t        | |      rt        ||      r||f# }}}|st        S t        d |D              j                  \  }}t        d |D              j                  \  }}t         ||f   }	t         ||f   }
|	|
urOt        j                  d| j                   d|j                   d|j                   d|j                   d	t               |	S c c}}w )zP
    Find the most specific approximate match, assuming single inheritance.
    c              3   ,   K   | ]  }t        |   y wr-   )r:   .0ms     r2   	<genexpr>z_dispatch_kl.<locals>.<genexpr>   s     55s   c              3   >   K   | ]  }t        t        |         y wr-   )r:   reversedrO   s     r2   rR   z_dispatch_kl.<locals>.<genexpr>   s     AA68A;/As   zAmbiguous kl_divergence(z, z). Please register_kl())	r'   r7   NotImplementedminr;   warningswarnrH   RuntimeWarning)r0   r1   super_psuper_qmatchesleft_pleft_qright_qright_pleft_fun	right_funs              r2   _dispatch_klrd   q   s     !-GWfg&:fg+F 
'G 
  5W55;;NFFAAAGGGWFFN+HWg-.Iy &v&7r&//9J K""(//!2"W5E5E4FaI	

 O)s   &C$c                 6    t        j                  | t              S )zI
    Helper function for obtaining infinite KL Divergence throughout
    )torch	full_liker   tensors    r2   _infinite_likerj      s     ??63''r4   c                 (    | | j                         z  S )z2
    Utility function for calculating x log x
    )logrh   s    r2   _x_log_xrm      s     FJJL  r4   c                     | j                  d      }| j                  d      }| j                  d||z        j                  d      j                  d      }|j                  | 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nrQ   
flat_traces       r2   _batch_trace_XXTrz      sc     			"A		"Ab!a%(,,Q/33B7Jdjj"o..r4   pqreturnc                 f   	 t         t        |       t        |      f   }|t        u r9t        d| j                  j                   d|j                  j                          || |      S # t        $ r> t        t        |       t        |            }|t         t        |       t        |      f<   Y w xY w)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(   r6   KeyErrorrd   rV   NotImplementedError	__class__rH   )r{   r|   r/   s      r2   r*   r*      s    &,$q'47*+ n!6q{{7K7K6LLYZYdYdYmYmXno
 	
 q!9  ,47DG,(+DGT!W$%,s   A) )AB0/B0c                    | j                   t        j                  j                  j	                  |j
                         t        j                  j                  j	                  | j
                         z
  z  }t        ||j                   dk(  <   d|| j                   dk(  <   d| j                   z
  t        j                  j                  j	                  |j
                        t        j                  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       r2   _kl_bernoulli_bernoullir      s    	
$$ahhY/
((


&
&y
1	2
B Bqww!|Bqww!|
agg+$$QXX.1D1D1M1Mahh1WW
B Bqww!|Bqww!|7Nr4   c                    | j                   | j                  z   }|j                   |j                  z   }|j                   j                         |j                  j                         z   |j                         z   }| j                   j                         | j                  j                         z   |j                         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	            r2   _kl_beta_betar      s   ##a&6&66L##a&6&66L	
			 	 	"Q%5%5%<%<%>	>,AVAVAX	XB	
			 	 	"Q%5%5%<%<%>	>,AVAVAX	XB


Q--
-q?O?O1P	PB


Q--
-q?O?O1P	PB

%|)D	DB7R<"r!!r4   c                    | j                   |j                   k  j                         rt        d      | j                   | j                  | j                  |j                  z
  z  | j                   j                         z   |j                   j                         z
  z  }| j                   |j                   kD  }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       r2   _kl_binomial_binomialr      s     	
%**,!Y
 	
 
	188ahh&'AGG8*:*:*<<?O?O?QQ
B }}q}},H!"X,/BxLIr4   c                     | j                   | j                  |j                  z
  z  }t        ||j                   dk(  j                  |      <   d|| j                   dk(  j                  |      <   |j	                  d      S )Nr   ro   )r   r   r   	expand_asru   )r{   r|   ts      r2   _kl_categorical_categoricalr      se    	188ahh&'A%(Aqww!|q!"%&Aqww!|q!"559r4   c                 $   | j                   | j                  |j                  z
  z  }| j                         t        j                  | j
                         z   }|j                          t        j                  |j
                         z
  }||z   |z   S r-   )meanr   _cont_bern_log_normrf   r   r   r{   r|   r   r   r   s        r2   -_kl_continuous_bernoulli_continuous_bernoullir      sr    	
188ahh&	'B	
			 5;;x#8	8B



!	!EKK$9	9B7R<r4   c                    | j                   j                  d      }|j                   j                  d      }|j                         |j                         z
  }| j                   j                         |j                   j                         z
  j                  d      }| j                   |j                   z
  }| j                   j                         |j                         j	                  d      z
  }||z
  ||z  j                  d      z   S )Nro   )concentrationru   r   r   	unsqueeze)r{   r|   sum_p_concentrationsum_q_concentrationr   r   r   r   s           r2   _kl_dirichlet_dirichletr     s     //--b1//--b1		#	#	%(;(B(B(D	DB
//
 
 
"Q__%;%;%=
=	B	B2	FB	
1??	*B	
	 	 	"%8%@%@%B%L%LR%P	PB7b2g]]2&&&r4   c                 f    |j                   | j                   z  }|j                          }||z   dz
  S Nr	   raterl   )r{   r|   
rate_ratior   s       r2   _kl_exponential_exponentialr     s1    !&&J
..
	B
?Qr4   c                    t        |       t        |      k(  st        d      | j                  D cg c]   }|j                         j	                         " }}|j                  } | j
                  | }t        j                  j                  |j                         |d      } |j
                  | |z
  }t        |||      D ]0  \  }}	}
|	|z
  |
z  }|t        |t        |j                              z  }2 |S c c}w )NzThe cross KL-divergence between different exponential families cannot                             be computed using Bregman divergencesT)create_graph)r6   r   _natural_paramsdetachrequires_grad__log_normalizerrf   autogradgradru   rD   r%   lenevent_shape)r{   r|   np	p_nparams	q_nparams	lg_normal	gradientsresultpnpqnpgterms               r2   _kl_expfamily_expfamilyr     s    7d1g!C
 	
 9:8I8IJ"++-JIJ!!I!!!9-I##IMMOYT#RIQ	*Y6F9i; ;S!c	Q.s1=='9::; M Ks   %C7c                    |j                   | j                  |j                  z  j                         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   rl   rf   r   r   r{   r|   r   r   r   r   s         r2   _kl_gamma_gammar   +  s    	
AFFQVVO002	2B	aoo	&aoo)F	FB
//AOO
+u}}Q__/M	MB
&&166/aoo6	7B7R<"r4   c                 T   | j                   |j                   z  }|j                  |j                   z  }| j                  |j                   z  }|j                          |z
  |z   }|t        z  }t	        j
                  |d|z   j                         z   |z
        }||z   |z   dt        z   z
  S r   )scalelocrl   _euler_gammarf   expr   )r{   r|   ct1ct2ct3r   r   r   s           r2   _kl_gumbel_gumbelr   4  s    
''AGG
C
%%!''/C
%%!''/C
'')c	C	B	|	B	3!c'))++c1	2B7R<1|+,,r4   c                     | j                          t        j                  |j                         | j                  z  z
  |j                  z
  S r-   )entropyrf   r   r   r   r{   r|   s     r2   _kl_geometric_geometricr   ?  s6    IIK<%++qwwh/!''99AHHDDr4   c                 B    t        | j                  |j                        S r-   )_kl_normal_normal	base_distr   s     r2   _kl_halfnormal_halfnormalr   D  s    Q[[!++66r4   c                 $   | j                   |j                   z  }| j                  |j                  z
  j                         }|j                          }||j                   z  }|t	        j
                  | | j                   z        z  }||z   |z   dz
  S r   )r   r   absrl   rf   r   )r{   r|   scale_ratioloc_abs_diffr   r   r   s          r2   _kl_laplace_laplacer   I  s~     ''AGG#KEEAEEM&&(L
//
	B		B	uyy,!89	9B7R<!r4   c                    | j                   |j                   k7  rt        d      t        |j                  |j                  |j
                        t        | j                  | j                  | j
                        z
  }t        |j                  |j                  |j                  | j                  z
  |j
                        }|j                  j                  |j                  j                  d      z  }t        j                  j                  |j
                  |d      }| j                  |j                  z  j                  d      }t        | j                  |j                  j                         j                  d      z        }t        || j                  j!                         j                  d      z        }t        |j#                  | 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 computedrp   Fupperro         ?r   )r   
ValueErrorr   _unbroadcasted_cov_factor_unbroadcasted_cov_diag_capacitance_trilr   r   mTr   rf   linalgsolve_triangularru   rz   rsqrtsqrtmatmul)r{   r|   term1term3	qWt_qDinvAterm21term22term23term24term2s              r2   7_kl_lowrankmultivariatenormal_lowrankmultivariatenormalr   T  s   }}%E
 	

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

 "	##Q%>%>@S@S	A''00br0BFFHLLRPPQE '	##	!!			E ++..1J1J1T1TUW1XXI%%a&9&99E%RA	##a&?&?&E&E&G&Q&QRT&UUF ahhq'B'BCDFVOE%%-%'!--*::;;r4   c                 P   | j                   |j                   k7  rt        d      d|j                  j                  dd      j	                         j                  d      z  t        | j                  | j                  | j                        z
  }t        |j                  |j                  | j                  z
        }t        j                  j                  |j                  j                  d d | j                  j                  d d       }| j                   d   }|j                  j!                  |||fz         }| j                  j!                  ||| j"                  j%                  d      fz         }t        j&                  | j                  j)                               j!                  |||fz         }t+        t        j,                  j/                  ||d            }	t+        t        j,                  j/                  ||d            }
|	|
z   }d	||z   |z   | j                   d   z
  z  S )
Nr   rq   rp   ro   r   r   Fr   r   )r   r   r   r   rl   ru   r   r   r   r   r   r   rf   _C_infer_sizerv   expand
cov_factorrr   
diag_embedr   rz   r   r   )r{   r|   r   r   combined_batch_shaperx   q_scale_trilp_cov_factor
p_cov_diagr   r   r   s               r2   0_kl_lowrankmultivariatenormal_multivariatenormalr    s   }}%E
 	

 ++44"24FJJLPP
 	##Q%>%>@S@S	E
 q::QUUQUU]LE !88//	##))#2.0K0K0Q0QRUSU0V 	
aA..556JaQRV6STL..551<<#4#4R#899L !!!";";"@"@"BCJJ1v%J %%lL%NF %%lJe%LF VOE%%-%'!--*::;;r4   c                 :   | j                   |j                   k7  rt        d      |j                  j                  dd      j	                         j                  d      | j                  j                  dd      j	                         j                  d      z
  }t        j                  j                  |j                  j                  d d | j                  j                  d d       }| j                   d   }|j                  j                  |||fz         }| j                  j                  |||fz         }t        t        j                  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 computedrp   ro   r   r   Fr   r   )r   r   r   r   rl   ru   rf   r  r  rv   r  rz   r   r   r   r   )	r{   r|   
half_term1r  rx   r	  p_scale_trilr   r   s	            r2   )_kl_multivariatenormal_multivariatenormalr    s    	}}%E
 	

 ,,552B5GKKMQQ
	##,,"2,>BBDHHLMJ !88//	##))#2.0K0K0Q0QRUSU0V 	
aA..556JaQRV6STL..556JaQRV6STL%%lL%NE q::QUUQUU]LEuu}q0111r4   c                     | j                   |j                   z  j                  d      }| j                  |j                  z
  |j                   z  j                  d      }d||z   dz
  |j                         z
  z  S Nrq   r   r	   r   rt   r   rl   )r{   r|   	var_ratior   s       r2   r   r     sc    177"''*I55155=AGG
#	(	(	+B)b.1$y}}677r4   c                 B    t        | j                  |j                        S r-   )r   _categoricalr   s     r2   '_kl_onehotcategorical_onehotcategoricalr    s    &q~~q~~FFr4   c                 D   | j                   |j                   z  }|j                  | j                  z  }|j                  |j                         z  }|j                          }||z   |z   dz
  }t        || j                  j
                  |j                  j
                  k  <   |S r   )r   alpharl   r   supportlower_bound)r{   r|   r   alpha_ratior   r   r   s          r2   _kl_pareto_paretor    s     ''AGG#K''AGG#K	
;??$	$B
//
	B"W{"Q&F<?F199  199#8#889Mr4   c                     | j                   | j                   j                         |j                   j                         z
  z  | j                   |j                   z
  z
  S r-   r   r   s     r2   _kl_poisson_poissonr    s;    66QVVZZ\AFFJJL01QVVaff_EEr4   c                     | j                   |j                   k7  rt        | j                  |j                  k7  rt        t        | j                  |j                        S r-   )
transformsr   r   r*   r   r   s     r2   _kl_transformed_transformedr"    sC    ||q||#!!}}%!!akk22r4   c                     |j                   |j                  z
  | j                   | j                  z
  z  j                         }t        ||j                  | j                  kD  |j                   | j                   k  z  <   |S r-   )highlowrl   r   r{   r|   r   s      r2   _kl_uniform_uniformr'    sY    vv~!&&155.1668F25FAEEAEEMaffqvvo./Mr4   c                     | j                          | j                  |j                  j                         z  |j                  z
  z
  S r-   )r   r   r   rl   r   s     r2   _kl_bernoulli_poissonr)     s1    IIK<177QVVZZ\1AFF:;;r4   c                     | j                          | j                  |j                  z  z
  t        j                  |j
                         z
  |j                         z
  S r-   )r   r   r   rf   r   r   r   r   s     r2   _kl_beta_continuous_bernoullir+    sS     

&&188
	
++qwwh
	  


!	"r4   c                 ,    t        | j                        S r-   )rj   r   r   s     r2   _kl_beta_infinityr-    s    !**++r4   c                     | j                          |j                  j                         z
  |j                  | j                  | j                  | j                  z   z  z  z   S r-   )r   r   rl   r   r   r   s     r2   _kl_beta_exponentialr/    sT     

&&**,	
&&A$$(8(81;K;K(KL
M	Nr4   c                    | j                          }|j                  j                         |j                  |j                  j	                         z  z
  }|j                  dz
  | j
                  j                         | j
                  | j                  z   j                         z
  z  }|j                  | j
                  z  | j
                  | j                  z   z  }||z   |z
  |z   S r   )r   r   r   r   rl   r   r   r   r   s         r2   _kl_beta_gammar1    s    
))+B	
			!AOOaffjjl$B	BB
//A
	  "a&6&69I9I&I%R%R%TT
B 
!""	"a&6&69I9I&I	JB7R<"r4   c                    | j                   | j                   | j                  z   z  }|j                  j                  d      }| j	                          }d|dz  t
        j                  z  j                         z  }|d|z
  z  | j                   | j                  z   dz   z  |j                  d      z   dz  }|j                  |z  }|j                  j                  d      dz  }||z   ||z
  |z   |z  z   S r  )	r   r   r   rt   r   mathpirl   r   )	r{   r|   E_beta
var_normalr   r   r   r   r   s	            r2   _kl_beta_normalr7  +  s    !1!1A4D4D!DEFQJ
))+B	
Q(--/	/B!f*!1!1A4D4D!Dq!HI
**Q-	
B 
B	
1	B7b2glj000r4   c                    | j                          |j                  |j                  z
  j                         z   }t        ||j                  | j
                  j                  kD  |j                  | j
                  j                  k  z  <   |S r-   )r   r$  r%  rl   r   r  r  upper_boundr&  s      r2   _kl_beta_uniformr:  :  sc    iik\QVVaee^0022FQTFAEEAII)))affqyy7L7L.LMNMr4   c                 ,    t        | j                        S r-   )rj   r   r   s     r2   !_kl_continuous_bernoulli_infinityr<  D  s    !''""r4   c                     | j                          t        j                  |j                        z
  |j                  | j                  z  z   S r-   )r   rf   rl   r   r   r   s     r2   $_kl_continuous_bernoulli_exponentialr>  I  s3    IIK<%))AFF++affqvvo==r4   c                    | j                          }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   r3  rl   r4  rf   squarer   r   variancer   r   s        r2   _kl_continuous_bernoulli_normalrB  R  s    
))+B	tww'%,,quuqww*GG	H599	L 
B **u||AFF+
+cAEEkAFF.B
Bell177##
B 7R<r4   c           	         | j                          |j                  |j                  z
  j                         z   }t	        j
                  t	        j                  t	        j                  |j                  | j                  j                        t	        j                  |j                  | j                  j                              t	        j                  |      t        z  |      S r-   )r   r$  r%  rl   rf   wheremaxger  r  ler9  	ones_liker   r&  s      r2    _kl_continuous_bernoulli_uniformrI  ^  s    iik\QVVaee^0022F;;		HHQUUAII112HHQVVQYY223	
 	#% r4   c                 ,    t        | j                        S r-   rj   r   r   s     r2   _kl_exponential_infinityrL  k  s    
 !&&!!r4   c                     |j                   | j                   z  }|j                   t        j                  |      z  }||z   |j                  j	                         z   |j                  t
        z  z   dt
        z   z
  S r   )r   r   rf   rl   r   r   )r{   r|   ratior   s       r2   _kl_exponential_gammarO  s  st    FFQVVOE
//	EIIe,	,B

	
//
 
 
"	# //L
(	) |		r4   c                     | j                   |j                  z  }|j                  |j                  z  }|j                         dz
  }t	        j
                  |      |z  |dz   z  }|j                         }||z
  |z   |z   S r   )r   r   r   rl   rf   r   
reciprocal)r{   r|   scale_rate_prodloc_scale_ratior   r   r   s          r2   _kl_exponential_gumbelrT    sx    ffqww&OeeaggoO					"B	?	#o	519L	MB		#	#	%B"$r))r4   c                 |   |j                   j                  d      }| j                  j                  d      }dt        j                  ||z  dz  t
        j                  z        z  }|j                         }|j                  | j                  z  }|j                  j                  d      dz  }|dz
  ||z
  |z   |z  z   S r  )	r   rt   r   rf   rl   r3  r4  rQ  r   )r{   r|   r6  rate_sqrr   r   r   r   s           r2   _kl_exponential_normalrW    s    QJvvzz!}H	uyyJ.2TWW<=	=B				B	
B	
1	B6R"Wr\Z///r4   c                 ,    t        | j                        S r-   )rj   r   r   s     r2   _kl_gamma_infinityrY    s    
 !//**r4   c                     | j                          |j                  j                         z
  |j                  | j                  z  | j                  z  z   S r-   )r   r   rl   r   r   s     r2   _kl_gamma_exponentialr[    s:    IIK<!&&**,&!//)AAFF)JJJr4   c                    | j                   |j                  z  }|j                  |j                  z  }| j                  dz
  | j                  j	                         z  | j                  j                         z
  | j                  z
  }|j                         | j                  |z  z   }t        j                  |      d|j                         z   j                  | j                         z  |z
  }||z   |z   S r   )r   r   r   r   r   r   rl   rf   r   rQ  rt   )r{   r|   beta_scale_prodrS  r   r   r   s          r2   _kl_gamma_gumbelr^    s    ffqww&OeeaggoO	
1	 7 7 99
//
 
 
"	#
//	 
 
			?!B	BB		/"))++
0
0!//1A
B	C
	 
 7R<r4   c                 r   |j                   j                  d      }| j                  j                  d      }dt        j                  ||z  dz  t
        j                  z        z  | j                  z
  | j                  j                         z
  }d| j                  j                  d      | j                  z   z  |z  }|j                  | j                  z  | j                  z  }d|j                  j                  d      z  }|| j                  dz
  | j                  j                         z  z   ||z
  |z   |z  z   S r  )r   rt   r   rf   rl   r3  r4  r   r   r   r   )r{   r|   r6  beta_sqrr   r   r   r   s           r2   _kl_gamma_normalra    s   QJvvzz!}Heii:-1DGG;<<
//	
//
 
 
"	# 
 
##A&8	9H	DB	
	 166	)B	quuyy|	B
??Q!//"9"9";
;	<7R<:
%	&r4   c                 ,    t        | j                        S r-   rj   r   r   s     r2   _kl_gumbel_infinityrd         !%%  r4   c                    | j                   |j                   z  }|t        j                  dt        j                  z        z  j	                         }t        j                  |z  dz  j                  d      dz  }| j                  | j                   t        z  z   |j                  z
  |j                   z  j                  d      dz  }| |z   |z   t        dz   z
  S )Nrq   r      r	   )r   r3  r   r4  rl   rt   r   r   )r{   r|   param_ratior   r   r   s         r2   _kl_gumbel_normalri    s    ''AGG#K
		!dgg+.
.	3	3	5B
''K
#
%	*	*1	-	1B55177\))AEE1QWW
<	A	A!	Ds	JB38b=L1,--r4   c                 ,    t        | j                        S r-   rc  r   s     r2   _kl_laplace_infinityrk    re  r4   c                    |j                   j                  d      }| j                   j                  d      |z  }dt        j                  d|z  t        j
                  z        z  }d| j                  j                  d      z  }| j                  |j                  z  }d|j                  j                  d      z  }| |z   ||z
  |z   |z  z   dz
  S r  )r   rt   rf   rl   r3  r4  r   )r{   r|   r6  scale_sqr_var_ratior   r   r   r   s           r2   _kl_laplace_normalrn    s    QJ''++a.:5	uyy00477:;	;B	quuyy|	B	
B	quuyy|	B3$$R"
'BBQFFr4   c                 ,    t        | j                        S r-   rc  r   s     r2   _kl_normal_infinityrp    re  r4   c                    | j                   |j                  z  }| j                  |j                  z  j                  d      }|j                   |j                  z  }|j                         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   rt   rl   rf   r   r3  r4  )r{   r|   mean_scale_ratiovar_scale_sqr_ratiorS  r   r   r   s           r2   _kl_normal_gumbelrt    s    uuqww77QWW,11!4eeaggoO		 	 	"S	(B	O	+B	$$s-@'@@?R	SB38b=C1txxDGG'<#<=>>r4   c                 F   | j                   |j                   z
  }| j                  |j                  z  }|| j                  z  }t        j                  |      }t	        j
                  dt        j                  z        | j                  z  t        j                  d|j                  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 )Nrq   g      r   r	   )
r   r   rf   rl   r3  r   r4  r   rt   erf)r{   r|   loc_diffr   loc_diff_scale_ratior   r   r   s           r2   _kl_normal_laplacery    s    uuquu}H''AGG#K#agg-	;	B		!dgg+(599T<P<T<TUV<W5W+XX  
EIIdiin/CCD	DB3"r'QWW$$q488C$''M3J/J(KLLr4   c                 ,    t        | j                        S r-   )rj   r   r   s     r2   _kl_pareto_infinityr{    s     !''""r4   c                 &   | j                   |j                  z  }| j                  |z  j                         }| j                  j	                         }| j                  |z  | j                  dz
  z  }||z
  |z   dz
  }t
        || j                  dk  <   |S r   )r   r   r  rl   rQ  r   )r{   r|   rR  r   r   r   r   s          r2   _kl_pareto_exponentialr}  !  s    gg&O
''O
#	(	(	*B	
			B	
?	"aggk	2B"Wr\AFF177a<Mr4   c                    | j                   j                         | j                  j                         z   }| j                  j                         |z
  }|j                  j                         |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   rl   r  rQ  r   r   r   r   r{   r|   common_termr   r   r   r   r   s           r2   _kl_pareto_gammar  ,  s    ''++-!''"4"4"66K	
	$B	
			!AOOaffjjl$B	BB
aoo
	,B	
!''	AGG	#qww{	3B"Wr\B"FF177a<Mr4   c                 d   d|j                   j                  d      z  }| j                   | j                  dz
  z  }t        j                  dt        j
                  z        |j                   z  | j                  z  | j                   z  j                         }| j                  j                         }| j                  |j                  d      z  | j                  dz
  z  }| j                  |z  |j                  z
  j                  d      }||z
  ||z   |z  z   dz
  }t        || j                  dk  <   |S )Nrq   r	   )
r   rt   r  r3  r   r4  rl   rQ  r   r   )	r{   r|   r6  r  r   r   r   r   r   s	            r2   _kl_pareto_normalr  ;  s    QWW[[^#J''QWWq[)K
))AK
 177
*QWW
4qww
>	C	C	EB	
			B	
;??1%	%1	5B
''K
!%%
'	,	,Q	/B"WR:--1FF177a<Mr4   c                 ,    t        | j                        S r-   rK  r   s     r2   _kl_poisson_infinityr  H  s     !&&!!r4   c                    | 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                         |j                  j                         z   |j                  |j                  z   j                         z
  }||z   |z
  |z
  }t        || j                   |j                  j                  kD  | j                  |j                  j                  k  z  <   |S r   )r$  r%  rf   rl   r   rm   r   r   r   r  r9  r  r  s           r2   _kl_uniform_betar  N  sI   &&155.K	;	B	
		A	AFFhquuo-;	=
	  
		A	AJ(1quu9"55C	E
	  	
!



!
!
#	$a...
6
6
8	9 
 "Wr\BFQTFAFFQYY***quuqyy7L7L/LMNMr4   c           	         | j                          | j                  |j                  z  z
  t        j                  |j
                         z
  |j                         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   rD  rE  rF  r$  r  r9  rG  r%  r  rH  r   r&  s      r2    _kl_uniform_continuous_bernoullir  f  s     

&&188
	
++qwwh
	  


!	"  ;;		HHQVVQYY223HHQUUAII112	
 	#% r4   c                    |j                   | j                  | j                  z   z  dz  | j                  | j                  z
  |j                   z  j                         z
  }t        || j                  |j
                  j                  k  <   |S )Nrq   )r   r$  r%  rl   r   r  r  r&  s      r2   _kl_uniform_exponetialr  x  sf    VVqvv~&*qvv~.G-L-L-NNF,/F155199((()Mr4   c                    | j                   | j                  z
  }|j                         }|j                  j	                         |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	   rq   )
r$  r%  rl   r   r   r   rm   r   r  r  r  s           r2   _kl_uniform_gammar    s    &&155.K		B	
			!AOOaffjjl$B	BB	
Q__	AFFhquuo-;	=
	 
 
166AEE>	"Q	&BS2X]RF,/F155199((()Mr4   c                    |j                   | j                  | j                  z
  z  }| j                  |j                  z
  |j                   z  }| j                  |j                  z
  |j                   z  }|j	                         d||z   z  z   }|t        j                  |       t        j                  |       z
  z  }||z
  S )Nr   )r   r$  r%  r   rl   rf   r   )r{   r|   r  high_loc_difflow_loc_diffr   r   s          r2   _kl_uniform_gumbelr    s    ''QVVaee^,KVVaee^qww.MEEAEEMQWW,L		SML$@A	AB			=.1EII|m4LL	MB7Nr4   c                    | j                   | j                  z
  }t        j                  t        j                  dz        |j
                  z  |z  j                         }|j                  d      dz  }| j                   | j                  z   d|j                  z  z
  dz  j                  d      }|d||z   z  |j
                  j                  d      z  z   S )Nrq      r   )	r$  r%  r3  r   r4  r   rl   rt   r   )r{   r|   r  r   r   r   s         r2   _kl_uniform_normalr    s    &&155.K
))DGGaK
 177
*[
8	=	=	?B
		1		"B66AEE>AI%
*	/	/	2BrBw!''++a.000r4   c                    | j                   | j                  z
  }|j                  |j                  j	                  |j                        z  |z  j                         }t        | j                         t        | j                        z
  |z
  |z  }||j                  dz   z  |z
  }t        || j                  |j                  j                  k  <   |S r   )
r$  r%  r  r   rt   rl   rm   r   r  r  )r{   r|   support_uniformr   r   r   s         r2   _kl_uniform_paretor    s    ffquunO
''AGGKK(
(O
<	A	A	CB
166
Xaee_
,
>/	QB177Q;"$F,/F155199((()Mr4   c                     | j                   |j                   k7  rt        t        | j                  |j                        }t	        || j                         S r-   )reinterpreted_batch_ndimsr   r*   r   r%   r&  s      r2   _kl_independent_independentr    sC    ""a&A&AA!!1;;4F&!"="=>>r4   c                    | j                   |j                   z   j                  d      | j                  |j                  z
  j                  d      z   j                         }d| j                   z  |j                   z  j                         }||z
  S )Nrq      r  r   s       r2   _kl_cauchy_cauchyr    sn     77QWW
!
!!
$':':1'=
=	B	B	DB
agg+
	$	$	&B7Nr4   c                     dg} t        t        d       D ]1  \  }}| j                  d|j                   d|j                   d       3 dj	                  |       }t
        j                  rt
        xj                  |z  c_        yy)	zHAppends a list of implemented KL functions to the doc for kl_divergence.zLKL divergence is currently implemented for the following distribution pairs:c                 >    | d   j                   | d   j                   fS r   )rH   )p_qs    r2   <lambda>z_add_kl_info.<locals>.<lambda>  s    s1vA&H r4   )keyz* :class:`~torch.distributions.z#` and :class:`~torch.distributions.`z
	N)sortedr'   appendrH   joinr*   __doc__)rowsr{   r|   kl_infos       r2   _add_kl_infor    s     	WD H 
1 	-ajj\9\]^]g]g\hhij	

 kk$G( r4   )r3  rX   	functoolsr   typingr   r   r   r   rf   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'   __annotations__r(   __all__r)   r:   rd   rj   rm   rz   Tensorr*   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  r7  r:  r<  r>  rB  rI  rL  rO  rT  rW  rY  r[  r^  ra  rd  ri  rk  rn  rp  rt  ry  r{  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  rL   r4   r2   <module>r     sX	     $ . .       $  5   & ) $     # $  
 H  2   =  A
  d	$*x 
  T	$*x  /
*(V   $6(!/\ l u|| L Y	" # T4" " Xx  ! [+& '  "56 7 Y	"' #' [+& '  12 3" UE  VV- - Y	"E #E Z$7 %7 Wg  &(AB< C<B !:;< <<: &(:;!< <!<H !342 520 VV8 8  12G 3G VV  WgF F $&=>3 ?3 Wg  Y < !< T&' ( T6, , T;   T5  T61 1 T7   &)# *#  +.> />  &) *  '*	 +	 [$[-.[&!['"" # " /  " [% 	 !	 [&!* "* [&!0 "0 UDU'(UFUG+   ) + UK K !K UF ( UF $ VTV()V[!VUVVVW!    " * ! VV. . WdW)*Wk"WeWfWg!    # + ! WfG G VTV()V[!VUVVVW!    " * ! VV? ? VW	M 	M VTV()VW#  * # V[! " VU  VV	 	 Wi Wh"   !" Wd . W)* +" Wk" # We  Wf  Wf1 1 Wf  [+&? '? VV )r4   