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))
  ```
code: def _parameter_control_dependencies(self, is_init):
      if not self.validate_args:
          return []
      assertions = []
  
      # Ensure that all batch shapes are consistent.
      #
      # NOTE: If the ranks/shapes are known statically, the assertions will be
      # evaluated statically, but the calls to `batch_shape_tensor()` here will
      # cause the assertions for `self._cat` and `self._components[i]` to be
      # checked.  In `__init__`, we could record whether or not all batch ranks/
      # shapes are known statically, in order to skip the checks here.
      cat_batch_shape = self._cat.batch_shape_tensor()
      cat_batch_rank = ps.rank_from_shape(
          cat_batch_shape, self._cat.batch_shape
      )
      batch_shapes = [d.batch_shape_tensor() for d in self.components]
      batch_ranks = [
          ps.rank_from_shape(
              batch_shapes[i], self.components[i].batch_shape
          )
          for i in range(len(self.components))
      ]
      check_message = (
          "components[{}] batch shape must match cat batch shape"
      )
      for i in range(len(self._components)):
          # NOTE: We have to compare the ranks, as well as the shapes, because
          # `assert_equal(shape1, shape2)` broadcasts and will return True if either
          # argument is `[]`.
          assertions.append(
              assert_util.assert_equal(
                  batch_ranks[i],
                  cat_batch_rank,
                  message=check_message.format(i),
              )
          )
          assertions.append(
              assert_util.assert_equal(
                  batch_shapes[i],
                  cat_batch_shape,
                  message=check_message.format(i),
              )
          )
  
      return assertions
  
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 18 for calling the _Mixture obj's underlying member method code with example usage: obj._parameter_control_dependencies(is_init) and returns: assertions, list