class_docstr: Mixture distribution.
  
  The `Mixture` object implements batched mixture distributions.
  The mixture model is defined by a `Categorical` distribution (the mixture)
  and a python list of `Distribution` objects.
  
  In the common case that the component distributions are all the same
  `Distribution` class (potentially with different parameters), it's probably
  better to use `tfp.distributions.MixtureSameFamily` instead.
  
  Methods supported include `log_prob`, `prob`, `mean`, `sample`, and
  `entropy_lower_bound`.
  
  
  #### Examples
  
  ```python
  # Create a mixture of two Gaussians:
  tfd = tfp.distributions
  mix = 0.3
  bimix_gauss = tfd.Mixture(
    cat=tfd.Categorical(probs=[mix, 1.-mix]),
    components=[
      tfd.Normal(loc=-1., scale=0.1),
      tfd.Normal(loc=+1., scale=0.5),
  ])
  
  # Plot the PDF.
  import matplotlib.pyplot as plt
  x = tf.linspace(-2., 3., int(1e4))
  plt.plot(x, bimix_gauss.prob(x))
  ```
docstr: A lower bound on the entropy of this mixture model.
  
  The bound below is not always very tight, and its usefulness depends
  on the mixture probabilities and the components in use.
  
  A lower bound is useful for ELBO when the `Mixture` is the variational
  distribution:
  
  \\(
  \log p(x) >= ELBO = \int q(z) \log p(x, z) dz + H[q]
  \\)
  
  where \\( p \\) is the prior distribution, \\( q \\) is the variational,
  and \\( H[q] \\) is the entropy of \\( q \\). If there is a lower bound
  \\( G[q] \\) such that \\( H[q] \geq G[q] \\) then it can be used in
  place of \\( H[q] \\).
  
  For a mixture of distributions \\( q(Z) = \sum_i c_i q_i(Z) \\) with
  \\( \sum_i c_i = 1 \\), by the concavity of \\( f(x) = -x \log x \\), a
  simple lower bound is:
  
  \\(
  \begin{align}
  H[q] & = - \int q(z) \log q(z) dz \\\
     & = - \int (\sum_i c_i q_i(z)) \log(\sum_i c_i q_i(z)) dz \\\
     & \geq - \sum_i c_i \int q_i(z) \log q_i(z) dz \\\
     & = \sum_i c_i H[q_i]
  \end{align}
  \\)
  
  This is the term we calculate below for \\( G[q] \\).
  
  Args:
    name: A name for this operation (optional).
  
  Returns:
    A lower bound on the Mixture's entropy.
code: def entropy_lower_bound(self, name="entropy_lower_bound"):
      r"""A lower bound on the entropy of this mixture model.
  
      The bound below is not always very tight, and its usefulness depends
      on the mixture probabilities and the components in use.
  
      A lower bound is useful for ELBO when the `Mixture` is the variational
      distribution:
  
      \\(
      \log p(x) >= ELBO = \int q(z) \log p(x, z) dz + H[q]
      \\)
  
      where \\( p \\) is the prior distribution, \\( q \\) is the variational,
      and \\( H[q] \\) is the entropy of \\( q \\). If there is a lower bound
      \\( G[q] \\) such that \\( H[q] \geq G[q] \\) then it can be used in
      place of \\( H[q] \\).
  
      For a mixture of distributions \\( q(Z) = \sum_i c_i q_i(Z) \\) with
      \\( \sum_i c_i = 1 \\), by the concavity of \\( f(x) = -x \log x \\), a
      simple lower bound is:
  
      \\(
      \begin{align}
      H[q] & = - \int q(z) \log q(z) dz \\\
         & = - \int (\sum_i c_i q_i(z)) \log(\sum_i c_i q_i(z)) dz \\\
         & \geq - \sum_i c_i \int q_i(z) \log q_i(z) dz \\\
         & = \sum_i c_i H[q_i]
      \end{align}
      \\)
  
      This is the term we calculate below for \\( G[q] \\).
  
      Args:
        name: A name for this operation (optional).
  
      Returns:
        A lower bound on the Mixture's entropy.
      """
      with self._name_and_control_scope(name):
          distribution_entropies = [
              d.entropy() for d in self.components
          ]
          cat_probs = self._cat_probs(log_probs=False)
          partial_entropies = [
              c_p * m
              for (c_p, m) in zip(cat_probs, distribution_entropies)
          ]
          # These are all the same shape by virtue of matching batch_shape
          return tf.add_n(partial_entropies)
  
imports: import warnings
  import tensorflow.compat.v2
  from tensorflow_probability.python.distributions import categorical
  from tensorflow_probability.python.distributions import distribution
  from tensorflow_probability.python.internal import assert_util
  from tensorflow_probability.python.internal import auto_composite_tensor
  from tensorflow_probability.python.internal import distribution_util
  from tensorflow_probability.python.internal import parameter_properties
  from tensorflow_probability.python.internal import prefer_static
  from tensorflow_probability.python.internal import reparameterization
  from tensorflow_probability.python.internal import samplers
  from tensorflow_probability.python.internal import tensorshape_util
  from tensorflow_probability.python.util.seed_stream import SeedStream
  from tensorflow_probability.python.util.seed_stream import TENSOR_SEED_MSG_PREFIX
label_desc: Use image node_id 15 for calling the _Mixture obj's underlying member method code with example usage: obj.entropy_lower_bound(name) and returns: tf