
    i|              	          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 Zy)n    N)Callable)total_ordering)infTensor   )	Bernoulli)Beta)Binomial)Categorical)Cauchy)ContinuousBernoulli)	Dirichlet)Distribution)ExponentialFamily)Exponential)Gamma)	Geometric)Gumbel)
HalfNormal)Independent)Laplace)_batch_lowrank_logdet_batch_lowrank_mahalanobisLowRankMultivariateNormal)_batch_mahalanobisMultivariateNormal)Normal)OneHotCategorical)Pareto)Poisson)TransformedDistribution)Uniform)_sum_rightmosteuler_constant_KL_REGISTRY_KL_MEMOIZEregister_klkl_divergencec                      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    P/var/www/html/engine/venv/lib/python3.12/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   sh    4 fd#
6<(HDVHM
 	
 fd#
6<(HDVHM
 	

 r2   c                   $    e Zd ZdgZd Zd Zd Zy)_Matchtypesc                     || _         y r+   r9   )selfr9   s     r0   __init__z_Match.__init__b   s	    
r2   c                 4    | j                   |j                   k(  S r+   r;   )r<   others     r0   __eq__z_Match.__eq__e   s    zzU[[((r2   c                 |    t        | j                  |j                        D ]  \  }}t        ||      s y||us y y)NFT)zipr9   r5   )r<   r?   xys       r0   __le__z_Match.__le__h   sC    

EKK0 	DAqa#z	
 r2   N)__name__
__module____qualname__	__slots__r=   r@   rE    r2   r0   r8   r8   ^   s    	I)r2   r8   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rQt        j                  d| j                   d|j                   d|j                   d|j                   d	t        d       |	S c c}}w )	zP
    Find the most specific approximate match, assuming single inheritance.
    c              3   ,   K   | ]  }t        |   y wr+   )r8   .0ms     r0   	<genexpr>z_dispatch_kl.<locals>.<genexpr>   s     55s   c              3   >   K   | ]  }t        t        |         y wr+   )r8   reversedrM   s     r0   rP   z_dispatch_kl.<locals>.<genexpr>   s     AA68A;/As   zAmbiguous kl_divergence(z, z). Please register_kl()   )
stacklevel)	r%   r5   NotImplementedminr9   warningswarnrF   RuntimeWarning)r.   r/   super_psuper_qmatchesleft_pleft_qright_qright_pleft_fun	right_funs              r0   _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    r0   _infinite_likerj      s     ??63''r2   c                 B    t         j                  j                  | |       S )z2
    Utility function for calculating x log x
    )rf   specialxlogyrh   s    r0   _x_log_xrn      s     ==vv..r2   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
    rT   N)sizereshapepowsumshape)bmatnrO   
flat_traces       r0   _batch_trace_XXTrz      sc     			"A		"Ab!a%(,,Q/33B7Jdjj"o..r2   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&   r4   KeyErrorrd   rV   NotImplementedError	__class__rF   )r{   r|   r-   s      r0   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       r0   _kl_bernoulli_bernoullir      s    	
$$ahhY/
((


&
&y
1	2
B Bqww!|Bqww!|
agg+$$QXX.1D1D1M1Mahh1WW
B Bqww!|Bqww!|7Nr2   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	            r0   _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!!r2   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       r0   _kl_binomial_binomialr      s     	
%**,!Y
 	
 
	188ahh&'AGG8*:*:*<<?O?O?QQ
B }}q}},H!"X,/BxLIr2   c                     | j                   | j                  |j                  z
  z  }t        ||j                   dk(  j                  |      <   d|| j                   dk(  j                  |      <   |j	                  d      S )Nr   rp   )r   r   r   	expand_asru   )r{   r|   ts      r0   _kl_categorical_categoricalr      se    	188ahh&'A%(Aqww!|q!"%&Aqww!|q!"559r2   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        r0   -_kl_continuous_bernoulli_continuous_bernoullir      sr    	
188ahh&	'B	
			 5;;x#8	8B



!	!EKK$9	9B7R<r2   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 )Nrp   )concentrationru   r   r   	unsqueeze)r{   r|   sum_p_concentrationsum_q_concentrationr   r   r   r   s           r0   _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&&&r2   c                 f    |j                   | j                   z  }|j                          }||z   dz
  S Nr   ratelog)r{   r|   
rate_ratior   s       r0   _kl_exponential_exponentialr     s1    !&&J
..
	B
?Qr2   c                    t        |       t        |      ur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)r4   r   _natural_paramsdetachrequires_grad__log_normalizerrf   autogradgradru   rB   r#   lenevent_shape)r{   r|   np	p_nparams	q_nparams	lg_normal	gradientsresultpnpqnpgterms               r0   _kl_expfamily_expfamilyr     s    Awd1g!C
 	
 9:8I8IJ"++-JIJ!!I!!!9-I##IMMOYT#RIQ	*Y6F9i; ;S!c	Q.s1=='9::; M Ks   %C6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   r   rf   r   r   r{   r|   r   r   r   r   s         r0   _kl_gamma_gammar   ,  s    	
AFFQVVO002	2B	aoo	&aoo)F	FB
//AOO
+u}}Q__/M	MB
&&166/aoo6	7B7R<"r2   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locr   _euler_gammarf   expr   )r{   r|   ct1ct2ct3r   r   r   s           r0   _kl_gumbel_gumbelr   5  s    
''AGG
C
%%!''/C
%%!''/C
'')c	C	B	|	B	3!c'))++c1	2B7R<1|+,,r2   c                     | j                          t        j                  |j                         | j                  z  z
  |j                  z
  S r+   )entropyrf   r   r   r   r{   r|   s     r0   _kl_geometric_geometricr   @  s6    IIK<%++qwwh/!''99AHHDDr2   c                 B    t        | j                  |j                        S r+   )_kl_normal_normal	base_distr   s     r0   _kl_halfnormal_halfnormalr   E  s    Q[[!++66r2   c                 $   | j                   |j                   z  }| j                  |j                  z
  j                         }|j                          }||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   J  s~     ''AGG#KEEAEEM&&(L
//
	B		B	uyy,!89	9B7R<!r2   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 computedrq   Fupperrp         ?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              r0   7_kl_lowrankmultivariatenormal_lowrankmultivariatenormalr   U  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%%-%'!--*::;;r2   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 computedrT   rq   rp   dim1dim2Fr   r   r   )r   r   r   r   r   r   _unbroadcasted_scale_trildiagonalr   ru   r   r   r   r   rf   r   r   rz   r   r   )	r{   r|   r   r   r   r   r   r   r   s	            r0   0_kl_multivariatenormal_lowrankmultivariatenormalr  w  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%%-%'!--*::;;r2   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   rT   rq   rp   r   r   Fr   r   )r   r   r   r  r   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               r0   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%%-%'!--*::;;r2   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 computedrq   rp   r   r   Fr   r   )r   r   r   r  r   ru   rf   r  r  rv   r  rz   r   r   r   r   )	r{   r|   
half_term1r	  rx   r
  p_scale_trilr   r   s	            r0   )_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1r2   c                     | j                   |j                   z  j                  d      }| j                  |j                  z
  |j                   z  j                  d      }d||z   dz
  |j                         z
  z  S NrT   r   r   r   rt   r   r   )r{   r|   	var_ratior   s       r0   r   r     sc    177"''*I55155=AGG
#	(	(	+B)b.1$y}}677r2   c                 B    t        | j                  |j                        S r+   )r   _categoricalr   s     r0   '_kl_onehotcategorical_onehotcategoricalr    s    &q~~q~~FFr2   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   alphar   r   supportlower_bound)r{   r|   r   alpha_ratior   r   r   s          r0   _kl_pareto_paretor    s     ''AGG#K''AGG#K	
;??$	$B
//
	B"W{"Q&F<?F199  199#8#889Mr2   c                     | j                   | j                   j                         |j                   j                         z
  z  | j                   |j                   z
  z
  S r+   r   r   s     r0   _kl_poisson_poissonr     s;    66QVVZZ\AFFJJL01QVVaff_EEr2   c                     | j                   |j                   k7  rt        | j                  |j                  k7  rt        t        | j                  |j                        S r+   )
transformsr   r   r(   r   r   s     r0   _kl_transformed_transformedr#    sC    ||q||#!!}}%!!akk22r2   c                     |j                   |j                  z
  | j                   | j                  z
  z  j                         }t        ||j                  | j                  kD  |j                   | j                   k  z  <   |S r+   )highlowr   r   r{   r|   r   s      r0   _kl_uniform_uniformr(    sY    vv~!&&155.1668F25FAEEAEEMaffqvvo./Mr2   c                     | j                          | j                  |j                  j                         z  |j                  z
  z
  S r+   )r   r   r   r   r   s     r0   _kl_bernoulli_poissonr*    s1    IIK<177QVVZZ\1AFF:;;r2   c                     | j                          | j                  |j                  z  z
  t        j                  |j
                         z
  |j                         z
  S r+   )r   r   r   rf   r   r   r   r   s     r0   _kl_beta_continuous_bernoullir,    sS     

&&188
	
++qwwh
	  


!	"r2   c                 ,    t        | j                        S r+   )rj   r   r   s     r0   _kl_beta_infinityr.    s    !**++r2   c                     | j                          |j                  j                         z
  |j                  | j                  | j                  | j                  z   z  z  z   S r+   )r   r   r   r   r   r   s     r0   _kl_beta_exponentialr0    sT     

&&**,	
&&A$$(8(81;K;K(KL
M	Nr2   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   r   r   r   r   r   s         r0   _kl_beta_gammar2    s    
))+B	
			!AOOaffjjl$B	BB
//A
	  "a&6&69I9I&I%R%R%TT
B 
!""	"a&6&69I9I&I	JB7R<"r2   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pir   r   )	r{   r|   E_beta
var_normalr   r   r   r   r   s	            r0   _kl_beta_normalr8  ,  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0r2   c                    | j                          |j                  |j                  z
  j                         z   }t        ||j                  | j
                  j                  kD  |j                  | j
                  j                  k  z  <   |S r+   )r   r%  r&  r   r   r  r  upper_boundr'  s      r0   _kl_beta_uniformr;  ;  sc    iik\QVVaee^0022FQTFAEEAII)))affqyy7L7L.LMNMr2   c                 ,    t        | j                        S r+   )rj   r   r   s     r0   !_kl_continuous_bernoulli_infinityr=  E  s    !''""r2   c                     | j                          t        j                  |j                        z
  |j                  | j                  z  z   S r+   )r   rf   r   r   r   r   s     r0   $_kl_continuous_bernoulli_exponentialr?  J  s3    IIK<%))AFF++affqvvo==r2   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   r4  r   r5  rf   squarer   r   variancer   r   s        r0   _kl_continuous_bernoulli_normalrC  S  s    
))+B	tww'%,,quuqww*GG	H599	L 
B **u||AFF+
+cAEEkAFF.B
Bell177##
B 7R<r2   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&  r   rf   wheremaxger  r  ler:  	ones_liker   r'  s      r0    _kl_continuous_bernoulli_uniformrJ  _  s    iik\QVVaee^0022F;;		HHQUUAII112HHQVVQYY223	
 	#% r2   c                 ,    t        | j                        S r+   rj   r   r   s     r0   _kl_exponential_infinityrM  l  s    
 !&&!!r2   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   r   r   r   )r{   r|   ratior   s       r0   _kl_exponential_gammarP  t  st    FFQVVOE
//	EIIe,	,B

	
//
 
 
"	# //L
(	) |		r2   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   r   rf   r   
reciprocal)r{   r|   scale_rate_prodloc_scale_ratior   r   r   s          r0   _kl_exponential_gumbelrU    sx    ffqww&OeeaggoO					"B	?	#o	519L	MB		#	#	%B"$r))r2   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   r   r4  r5  rR  r   )r{   r|   r7  rate_sqrr   r   r   r   s           r0   _kl_exponential_normalrX    s    QJvvzz!}H	uyyJ.2TWW<=	=B				B	
B	
1	B6R"Wr\Z///r2   c                 ,    t        | j                        S r+   )rj   r   r   s     r0   _kl_gamma_infinityrZ    s    
 !//**r2   c                     | j                          |j                  j                         z
  |j                  | j                  z  | j                  z  z   S r+   )r   r   r   r   r   s     r0   _kl_gamma_exponentialr\    s:    IIK<!&&**,&!//)AAFF)JJJr2   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   r   rf   r   rR  rt   )r{   r|   beta_scale_prodrT  r   r   r   s          r0   _kl_gamma_gumbelr_    s    ffqww&OeeaggoO	
1	 7 7 99
//
 
 
"	#
//	 
 
			?!B	BB		/"))++
0
0!//1A
B	C
	 
 7R<r2   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   r   r4  r5  r   r   r   r   )r{   r|   r7  beta_sqrr   r   r   r   s           r0   _kl_gamma_normalrb    s   QJvvzz!}Heii:-1DGG;<<
//	
//
 
 
"	# 
 
##A&8	9H	DB	
	 166	)B	quuyy|	B
??Q!//"9"9";
;	<7R<:
%	&r2   c                 ,    t        | j                        S r+   rj   r   r   s     r0   _kl_gumbel_infinityre         !%%  r2   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 )NrT   r      r   )r   r4  r   r5  r   rt   r   r   )r{   r|   param_ratior   r   r   s         r0   _kl_gumbel_normalrj    s    ''AGG#K
		!dgg+.
.	3	3	5B
''K
#
%	*	*1	-	1B55177\))AEE1QWW
<	A	A!	Ds	JB38b=L1,--r2   c                 ,    t        | j                        S r+   rd  r   s     r0   _kl_laplace_infinityrl    rf  r2   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   r   r4  r5  r   )r{   r|   r7  scale_sqr_var_ratior   r   r   r   s           r0   _kl_laplace_normalro    s    QJ''++a.:5	uyy00477:;	;B	quuyy|	B	
B	quuyy|	B3$$R"
'BBQFFr2   c                 ,    t        | j                        S r+   rd  r   s     r0   _kl_normal_infinityrq    rf  r2   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   r   rf   r   r4  r5  )r{   r|   mean_scale_ratiovar_scale_sqr_ratiorT  r   r   r   s           r0   _kl_normal_gumbelru    s    uuqww77QWW,11!4eeaggoO		 	 	"S	(B	O	+B	$$s-@'@@?R	SB38b=C1txxDGG'<#<=>>r2   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 )NrT   g      r   r   )
r   r   rf   r   r4  r   r5  r   rt   erf)r{   r|   loc_diffr   loc_diff_scale_ratior   r   r   s           r0   _kl_normal_laplacerz    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Lr2   c                 ,    t        | j                        S r+   )rj   r   r   s     r0   _kl_pareto_infinityr|    s     !''""r2   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  r   rR  r   )r{   r|   rS  r   r   r   r   s          r0   _kl_pareto_exponentialr~  "  s    gg&O
''O
#	(	(	*B	
			B	
?	"aggk	2B"Wr\AFF177a<Mr2   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   r   r  rR  r   r   r   r   r{   r|   common_termr   r   r   r   r   s           r0   _kl_pareto_gammar  -  s    ''++-!''"4"4"66K	
	$B	
			!AOOaffjjl$B	BB
aoo
	,B	
!''	AGG	#qww{	3B"Wr\B"FF177a<Mr2   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 )NrT   r   )
r   rt   r  r4  r   r5  r   rR  r   r   )	r{   r|   r7  r  r   r   r   r   r   s	            r0   _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<Mr2   c                 ,    t        | j                        S r+   rL  r   s     r0   _kl_poisson_infinityr  I  s     !&&!!r2   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   r   r   rn   r   r   r   r  r:  r  r  s           r0   _kl_uniform_betar  O  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Mr2   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   rE  rF  rG  r%  r  r:  rH  r&  r  rI  r   r'  s      r0    _kl_uniform_continuous_bernoullir  g  s     

&&188
	
++qwwh
	  


!	"  ;;		HHQVVQYY223HHQUUAII112	
 	#% r2   c                    |j                   | j                  | j                  z   z  dz  | j                  | j                  z
  |j                   z  j                         z
  }t        || j                  |j
                  j                  k  <   |S )NrT   )r   r%  r&  r   r   r  r  r'  s      r0   _kl_uniform_exponetialr  y  sf    VVqvv~&*qvv~.G-L-L-NNF,/F155199((()Mr2   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   rT   )
r%  r&  r   r   r   r   rn   r   r  r  r  s           r0   _kl_uniform_gammar    s    &&155.K		B	
			!AOOaffjjl$B	BB	
Q__	AFFhquuo-;	=
	 
 
166AEE>	"Q	&BS2X]RF,/F155199((()Mr2   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   r   rf   r   )r{   r|   r  high_loc_difflow_loc_diffr   r   s          r0   _kl_uniform_gumbelr    s    ''QVVaee^,KVVaee^qww.MEEAEEMQWW,L		SML$@A	AB			=.1EII|m4LL	MB7Nr2   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 )NrT      r   )	r%  r&  r4  r   r5  r   r   rt   r   )r{   r|   r  r   r   r   s         r0   _kl_uniform_normalr    s    &&155.K
))DGGaK
 177
*[
8	=	=	?B
		1		"B66AEE>AI%
*	/	/	2BrBw!''++a.000r2   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   r   rn   r   r  r  )r{   r|   support_uniformr   r   r   s         r0   _kl_uniform_paretor    s    ffquunO
''AGGKK(
(O
<	A	A	CB
166
Xaee_
,
>/	QB177Q;"$F,/F155199((()Mr2   c                     | j                   |j                   k7  rt        t        | j                  |j                        }t	        || j                         S r+   )reinterpreted_batch_ndimsr   r(   r   r#   r'  s      r0   _kl_independent_independentr    sC    ""a&A&AA!!1;;4F&!"="=>>r2   c                    | j                   |j                   z   j                  d      | j                  |j                  z
  j                  d      z   j                         }d| j                   z  |j                   z  j                         }||z
  S )NrT      r  r   s       r0   _kl_cauchy_cauchyr    sn     77QWW
!
!!
$':':1'=
=	B	B	DB
agg+
	$	$	&B7Nr2   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   )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 
1 	-ajj\9\]^]g]g\hhij	

 kk$G( r2   )r4  rX   collections.abcr   	functoolsr   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   rz   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  r8  r;  r=  r?  rC  rJ  rM  rP  rU  rX  rZ  r\  r_  rb  re  rj  rl  ro  rq  ru  rz  r|  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  rJ   r2   r0   <module>r     sQ	     $ $       $  5   & ) $     # $  
 H  2   =  A
  d	$*x 
  T	$*x  /
*(V   $8(//\ l v 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 )r2   