
    קg{              	          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	jL        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 ZdS )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                 R    | t           f<   t                                           | S N)r'   r(   clear)funtype_ptype_qs    R/var/www/html/ai-engine/env/lib/python3.11/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   s    4 fd## 

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

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


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

 Or4   c                 6    t          j        | t                    S )zI
    Helper function for obtaining infinite KL Divergence throughout
    )torch	full_liker   tensors    r2   _infinite_likerl      s     ?63'''r4   c                 0    | |                                  z  S )z2
    Utility function for calculating x log x
    )logrj   s    r2   _x_log_xro      s     FJJLL  r4   c                    |                      d          }|                      d          }|                     d||z                                d                              d          }|                    | j        dd                   S )zp
    Utility function for calculating the trace of XX^{T} with X having arbitrary trailing batch dimensions
       N)sizereshapepowsumshape)bmatnrU   
flat_traces       r2   _batch_trace_XXTr|      ss     			"A		"Ab!a%((,,Q//33B77Jdj"o...r4   pqreturnc                    	 t           t          |           t          |          f         }n`# t          $ rS t          t          |           t          |                    }|t           t          |           t          |          f<   Y nw xY w|t          u r)t          d| j        j         d|j        j                    || |          S )a"  
    Compute Kullback-Leibler divergence :math:`KL(p \| q)` between two distributions.

    .. math::

        KL(p \| q) = \int p(x) \log\frac {p(x)} {q(x)} \,dx

    Args:
        p (Distribution): A :class:`~torch.distributions.Distribution` object.
        q (Distribution): A :class:`~torch.distributions.Distribution` object.

    Returns:
        Tensor: A batch of KL divergences of shape `batch_shape`.

    Raises:
        NotImplementedError: If the distribution types have not been registered via
            :meth:`register_kl`.
    z(No KL(p || q) is implemented for p type z and q type )r(   r6   KeyErrorrf   rZ   NotImplementedError	__class__rH   )r}   r~   r/   s      r2   r*   r*      s    &,$q''477*+ , , ,477DGG,,(+DGGT!WW$%%%, n!oq{7KooYZYdYmoo
 
 	
 3q!99s   ), AB	B	c                    | j         t          j        j                            |j                   t          j        j                            | j                   z
  z  }t          ||j         dk    <   d|| j         dk    <   d| j         z
  t          j        j                            |j                  t          j        j                            | j                  z
  z  }t          ||j         dk    <   d|| j         dk    <   ||z   S Nr   r	   )probsrh   nn
functionalsoftpluslogitsr   r}   r~   t1t2s       r2   _kl_bernoulli_bernoullir      s    	
$$ahY//
(

&
&y
1
1	2
B Bqw!|Bqw!|
ag+$$QX..1D1M1Mah1W1WW
B Bqw!|Bqw!|7Nr4   c                 R   | j         | j        z   }|j         |j        z   }|j                                         |j                                        z   |                                z   }| j                                         | j                                        z   |                                z   }| j         |j         z
  t          j        | j                   z  }| j        |j        z
  t          j        | j                  z  }||z
  t          j        |          z  }||z
  |z   |z   |z   S r-   )concentration1concentration0lgammarh   digamma)	r}   r~   sum_params_psum_params_qr   r   t3t4t5s	            r2   _kl_beta_betar      s	   #a&66L#a&66L	
		 	 	"	"Q%5%<%<%>%>	>,AVAVAXAX	XB	
		 	 	"	"Q%5%<%<%>%>	>,AVAVAXAX	XB

Q-
-q?O1P1P	PB

Q-
-q?O1P1P	PB

%|)D)D	DB7R<"r!!r4   c                 b   | j         |j         k                                     rt          d          | j         | j        | j        |j        z
  z  | j                                         z   |j                                         z
  z  }| j         |j         k    }t          ||                   ||<   |S )NzKKL between Binomials where q.total_count > p.total_count is not implemented)total_countanyr   r   r   log1prl   )r}   r~   klinf_idxss       r2   _kl_binomial_binomialr      s     	
%**,, 
!Y
 
 	
 
	18ah&'AG8*:*:*<*<<?O?O?Q?QQ
B }q},H!"X,//BxLIr4   c                     | j         | j        |j        z
  z  }t          ||j         dk                        |          <   d|| j         dk                        |          <   |                    d          S )Nr   rq   )r   r   r   	expand_asrw   )r}   r~   ts      r2   _kl_categorical_categoricalr      sc    	18ah&'A%(Aqw!|q!!"%&Aqw!|q!!"5599r4   c                     | j         | j        |j        z
  z  }|                                 t          j        | j                   z   }|                                 t          j        |j                   z
  }||z   |z   S r-   )meanr   _cont_bern_log_normrh   r   r   r}   r~   r   r   r   s        r2   -_kl_continuous_bernoulli_continuous_bernoullir      sp    	
18ah&	'B	
			 	 5;x#8#8	8B



!
!	!EK$9$9	9B7R<r4   c                 $   | j                             d          }|j                             d          }|                                |                                z
  }| j                                         |j                                         z
                      d          }| j         |j         z
  }| j                                         |                                                    d          z
  }||z
  ||z                      d          z   S )Nrq   )concentrationrw   r   r   	unsqueeze)r}   r~   sum_p_concentrationsum_q_concentrationr   r   r   r   s           r2   _kl_dirichlet_dirichletr     s     /--b11/--b11		#	#	%	%(;(B(B(D(D	DB
/
 
 
"
"Q_%;%;%=%=
=	B	B2	F	FB	
1?	*B	
	 	 	"	"%8%@%@%B%B%L%LR%P%P	PB7b2g]]2&&&&r4   c                 Z    |j         | j         z  }|                                 }||z   dz
  S Nr	   ratern   )r}   r~   
rate_ratior   s       r2   _kl_exponential_exponentialr     s0    !&J
..

	B
?Qr4   c                    t          |           t          |          k    st          d          d | j        D             }|j        } | j        | }t          j                            |                                |d          } |j        | |z
  }t          |||          D ]3\  }}}	||z
  |	z  }
|t          |
t          |j                            z  }4|S )NzThe cross KL-divergence between different exponential families cannot                             be computed using Bregman divergencesc                 Z    g | ](}|                                                                 )S rL   )detachrequires_grad_)rO   nps     r2   rR   z+_kl_expfamily_expfamily.<locals>.<listcomp>   s,    JJJ"++--JJJr4   T)create_graph)r6   r   _natural_params_log_normalizerrh   autogradgradrw   rD   r%   lenevent_shape)r}   r~   	p_nparams	q_nparams	lg_normal	gradientsresultpnpqnpgterms              r2   _kl_expfamily_expfamilyr     s    77d1gg!C
 
 	
 KJ8IJJJI!I!!9-I##IMMOOYT#RRIQ	*Y6F9i;; ; ;S!c	Q.s1='9'9:::Mr4   c                 `   |j         | j        |j        z                                  z  }t          j        |j                   t          j        | j                   z
  }| j         |j         z
  t          j        | j                   z  }|j        | j        z
  | j         | j        z  z  }||z   |z   |z   S r-   )r   r   rn   rh   r   r   r}   r~   r   r   r   r   s         r2   _kl_gamma_gammar   +  s    	
AFQVO0022	2B	ao	&	&ao)F)F	FB
/AO
+u}Q_/M/M	MB
&16/ao6	7B7R<"r4   c                 *   | j         |j         z  }|j        |j         z  }| j        |j         z  }|                                 |z
  |z   }|t          z  }t	          j        |d|z                                   z   |z
            }||z   |z   dt          z   z
  S r   )scalelocrn   _euler_gammarh   expr   )r}   r~   ct1ct2ct3r   r   r   s           r2   _kl_gumbel_gumbelr   4  s    
'AG
C
%!'/C
%!'/C
''))c	C	B	|	B	3!c'))+++c1	2	2B7R<1|+,,r4   c                     |                                   t          j        |j                   | j        z  z
  |j        z
  S r-   )entropyrh   r   r   r   r}   r~   s     r2   _kl_geometric_geometricr   ?  s3    IIKK<%+qwh//!'99AHDDr4   c                 6    t          | j        |j                  S r-   )_kl_normal_normal	base_distr   s     r2   _kl_halfnormal_halfnormalr   D  s    Q[!+666r4   c                     | j         |j         z  }| j        |j        z
                                  }|                                 }||j         z  }|t	          j        | | j         z            z  }||z   |z   dz
  S r   )r   r   absrn   rh   r   )r}   r~   scale_ratioloc_abs_diffr   r   r   s          r2   _kl_laplace_laplacer   I  sy     'AG#KEAEM&&((L
//

	B		B	uy,!899	9B7R<!r4   c                    | j         |j         k    rt          d          t          |j        |j        |j                  t          | j        | j        | j                  z
  }t          |j        |j        |j        | j        z
  |j                  }|j        j        |j        	                    d          z  }t          j                            |j        |d          }| j        |j        z                      d          }t          | j        |j                                        	                    d          z            }t          || j                                        	                    d          z            }t          |                    | j                            }	||z   |z
  |	z
  }
d||
z   |z   | j         d         z
  z  S )NzKL-divergence between two Low Rank Multivariate Normals with                          different event shapes cannot be computedrr   Fupperrq         ?r   )r   
ValueErrorr   _unbroadcasted_cov_factor_unbroadcasted_cov_diag_capacitance_trilr   r   mTr   rh   linalgsolve_triangularrw   r|   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 	#Q%>@S	 	E
 '	#	!			 E +.1J1T1TUW1X1XXI%%a&99E%RRA'!*CCHHLLF	#a&?&E&E&G&G&Q&QRT&U&UU F a!";"@"@"B"B"L"LR"P"PPQQFahhq'BCCDDFVOf$v-E%%-%'!-*::;;r4   c                    | j         |j         k    rt          d          t          |j        |j        |j                  d| j                            dd                                          	                    d          z  z
  }t          |j        |j        |j        | j        z
  |j                  }|j        j        |j                            d          z  }t          j                            |j        |d          }t#          | j        |j                                                            d          z            }t#          |                    | j                            }||z
  }d||z   |z   | j         d	         z
  z  S )
NKL-divergence between two (Low Rank) Multivariate Normals with                          different event shapes cannot be computedrs   rr   rq   dim1dim2Fr   r   r   )r   r   r   r   r   r   _unbroadcasted_scale_trildiagonalrn   rw   r   r   r   r   rh   r   r   r|   r   r   )	r}   r~   r   r   r   r   r   r   r   s	            r2   0_kl_multivariatenormal_lowrankmultivariatenormalr  v  sx   }%%E
 
 	

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

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

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

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