
    ǄgM	                     4    d dl Z d dlmZ dgZ G d de      Zy)    N)DistributionExponentialFamilyc                   <    e Zd ZdZed        Zd Zed        Zd Zy)r   a  
    ExponentialFamily is the abstract base class for probability distributions belonging to an
    exponential family, whose probability mass/density function has the form is defined below

    .. math::

        p_{F}(x; \theta) = \exp(\langle t(x), \theta\rangle - F(\theta) + k(x))

    where :math:`\theta` denotes the natural parameters, :math:`t(x)` denotes the sufficient statistic,
    :math:`F(\theta)` is the log normalizer function for a given family and :math:`k(x)` is the carrier
    measure.

    Note:
        This class is an intermediary between the `Distribution` class and distributions which belong
        to an exponential family mainly to check the correctness of the `.entropy()` and analytic KL
        divergence methods. We use this class to compute the entropy and KL divergence using the AD
        framework and Bregman divergences (courtesy of: Frank Nielsen and Richard Nock, Entropies and
        Cross-entropies of Exponential Families).
    c                     t         )zv
        Abstract method for natural parameters. Returns a tuple of Tensors based
        on the distribution
        NotImplementedErrorselfs    f/home/mcse/projects/flask_80/flask-venv/lib/python3.12/site-packages/torch/distributions/exp_family.py_natural_paramsz!ExponentialFamily._natural_params   
     "!    c                     t         )z
        Abstract method for log normalizer function. Returns a log normalizer based on
        the distribution and input
        r   )r
   natural_paramss     r   _log_normalizerz!ExponentialFamily._log_normalizer&   s
    
 "!r   c                     t         )zp
        Abstract method for expected carrier measure, which is required for computing
        entropy.
        r   r	   s    r   _mean_carrier_measurez'ExponentialFamily._mean_carrier_measure-   r   r   c                    | j                    }| j                  D cg c]   }|j                         j                         " }} | j                  | }t
        j                  j                  |j                         |d      }||z  }t        ||      D ]8  \  }}|||z  j                  | j                  dz         j                  d      z  }: |S c c}w )z_
        Method to compute the entropy using Bregman divergence of the log normalizer.
        T)create_graph)r   )r   r   detachrequires_grad_r   torchautogradgradsumzipreshape_batch_shape)r
   resultpnparams	lg_normal	gradientsnpgs           r   entropyzExponentialFamily.entropy5   s     ,,,8<8L8LM1188:,,.MM(D(('2	NN''	t'T	)), 	JEBrAv&&t'8'85'@AEEbIIF	J Ns   %CN)	__name__
__module____qualname____doc__propertyr   r   r   r'    r   r   r   r   	   s9    ( " "" " "r   )r    torch.distributions.distributionr   __all__r   r-   r   r   <module>r0      s!     9 
7 7r   